PAT 甲级测试题目 -- 1010 Radix

题目链接

题目描述

给你两个数以及其中一个数的基数(进制数),找出另一个数的基数,找不到就输出 Impassible

分析

思路不是很难,基本可以用进制转换加循环判断做,但是有坑。。。
坑1:上界不是36.。。。上界是确定的那个数的十进制加 1 。
坑2:暴力循环会导致时间超限,用二分法解决
坑3:二分过程中会有数据溢出,得到的负数处理方式和找到较大数处理方式一样,因为溢出的数和题目条件不符,所以可以舍弃。

实现

#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;

// 用于判断进制数是否合理,顺便记录下未提供进制数据的进制数,用于优化查找基数次数。

// 任意进制转换为 10 进制
long long TransSystemToDec(char* number, double radix) {
    double times = strlen(number) - 1;

    long long out = 0;
    for (int i = 0; i < strlen(number); i++) {
        if (number[i] <= '9')
            out += ((long long)(number[i] - '0')) * pow(radix, times);
        if (number[i] >= 'a')
            out += ((long long)(number[i] - 'a' + 10))*pow(radix, times);
        times--;
    }
    return out;
}

// 查找字符串中ASCII码最大的字符,用于做二分查找下界
int FindMax(char* N) {
    int maxChar = '0';
    for (int i = 0; i < strlen(N); i++) {
        if (maxChar < N[i])
            maxChar = N[i];
    }

    if (maxChar <= '9')
        maxChar = maxChar - '0';
    if (maxChar >= 'a')
        maxChar = maxChar - 'a' + 10;
    return maxChar;

}

int main() {
    int maxChar = '0';
    char N1[11], N2[11];
    long long n1, n2, left, right, middle;
    int radix;
    int tag;

    cin >> N1 >> N2 >> tag >> radix;

    if (tag == 1) {
        // 将确定的数转换成10进制整数
        n1 = TransSystemToDec(N1, radix);
        // 获得不确定数字符串中ASCII码最大的字符,作为二分查找下界
        maxChar = FindMax(N2);
        // 初始化二分查找需要的变量
        left = maxChar + 1;
        right = n1 + 1; // 上界为确定数的十进制 +1,原因是比(确定数的十进制 + 1)再大的进制数,它对应的(确定数的十进制 +1)这个值在该进制下的表示都不会变化
        middle = (left + right) / 2;

        while (right >= left) {
            if (n1 == TransSystemToDec(N2, middle)) {
                cout << middle;
                return 0;
            }
            // 这里 || 运算符后面的判断用于过滤比 long long 数据类型还大的数据,这样的数据题目中是不会使其符合题意的
            if (n1 < TransSystemToDec(N2, middle) || (TransSystemToDec(N2, middle) < 0)) {
                right = middle - 1;
                middle = (left + right) / 2;
            }
            else {
                left = middle + 1;
                middle = (left + right) / 2;
            }

        }
        cout << "Impossible";
    }
    if (tag == 2) {
        n2 = TransSystemToDec(N2, radix);
        maxChar = FindMax(N1);
        left = maxChar + 1;
        right = n2 + 1;
        middle = (left + right) / 2;

        while (right >= left) {
            if (n2 == TransSystemToDec(N1, middle)) {
                cout << middle;
                return 0;

            }
            if (n2 < TransSystemToDec(N1, middle) || TransSystemToDec(N1, middle) < 0) {
                right = middle - 1;
                middle = (left + right) / 2;
            }
            else {
                left = middle + 1;
                middle = (left + right) / 2;
            }

        }
        cout << "Impossible";

    }
    return 0;
}

希望能帮到大家!

原文地址:https://www.cnblogs.com/Breathmint/p/10290244.html

时间: 2024-08-29 20:10:39

PAT 甲级测试题目 -- 1010 Radix的相关文章

PAT 甲级测试题目 -- 1009 Product of Polynomials

题目链接 这题占个坑吧...我用了两种思路,一种将保存结果的数组初始化为 0,把乘积加上去,顺便记录下最后一个指数的值.用两次 2000 次 for 循环过滤掉 0 值以及输出答案,这个代码过了,但是后期测试的时候,有些测试用例会多出来空格,有些则格式不对..但是过了... 代码如下 #include<iostream> #include<stdio.h> using namespace std; int main() { double A[1001], B[1001]; int

PAT 甲级测试题目 -- 1012 The Best Rank

题目链接 题目描述 输入小于等于 2000 的数据 N,M,分别表示 学生的总数 和 查询学生的数量 输入 N 个学生的六位数 id 以及 C,M,E 三科成绩.输入 M 个查询学生的 id. 要求输出: 若被查询的 id 不存在,输出 N/A 若被查询的 id 存在,输出 C,M,E,A(average 平均分) 四个成绩中排名最高的排名,以及对应的分数类型(C, M, E, A).若有多余一个类型的分数相同,则按照 A > C > M > E 的优先序列输出 排名 和 分数类型 分析

PAT 甲级测试题目 -- 1013 Battle Over Cities

题目链接 题目描述 ??给你城市的数量 N(N<1000),城市中地铁的数量 M 以及 被可能占领的城市数量 K(每一次只占领一个城市,并且每次占领的城市不一样),接下来的 M 行根据地铁的数量给出每个地铁连接的两个城市编号.最后一行给你被占领的城市序列.城市编号为 1 到 N,请你求出若某个城市被占领了,连通剩下城市所需要修建的地铁个数. 分析 ??该题考察图的存储以及遍历.本题的难点在于把 "需要维修多少个地铁" 这个问题转换成 "需要多少次 dfs 才能遍历完整个

pat 甲级测试题目 -- 1016 Phone Bills

题目链接 题目描述 要求计算银行账单. 输入 第一行给你一天24小时(00:00~01:00 ...)每个小时每分钟的话费,单位是美分 第二行给你顾客列表(N 个) 接下来的 N 行是顾客的账单详情 CYLL 01:01:06:01 on-line 姓名 月:日:小时:分钟 状态 CYLL 01:28:16:05 off-line 姓名 月:日:小时:分钟 状态 on-line 和 off-line 必须一一对应该记录才有效 输出 对于输入有效的顾客,给出该顾客这个月的账单,格式如下 CYJJ

1010. Radix (25)——PAT (Advanced Level) Practise

题目信息: 1010. Radix (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a b

PAT 1010. Radix (25)

1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N1 and N2, your task i

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

PAT甲级考试题库1001 A+B Format 代码实现及相关知识学习

准备参加九年九月份的PAT甲级证书考试,对网站上的题目进行总结分析: 1001题 A+B Format (20 分) Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits). 计算a+b的值并以一定格式输出其和sum(数字需要