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 is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number “radix” is the radix of N1 if “tag” is 1, or of N2 if “tag” is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print “Impossible”. If the solution is not unique, output the smallest possible radix.

Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
long long stringToInteger(char* s,int radix){
    long long result=0;
    int i=(int)strlen(s)-1;
    long long product=1;
    while(i>=0){
        long long tmp=0;
        if(s[i]>='0'&&s[i]<='9'){
            tmp=(s[i]-'0');
        } else if(s[i]>='a'&&s[i]<='z'){
            tmp=(s[i]-'a'+10);
        }
        result+=tmp*product;
        if(result<0){//溢出
            return -1;
        }
        product*=radix;
        i--;
    }
    return result;
}
int main(){
    freopen("in.txt","r",stdin);
    char n1[20];
    char n2[20];
    int tag,radix;
    scanf("%s %s %d %d",n1,n2,&tag,&radix);
    if(tag==2){
        swap(n1,n2);
    }
    long long target=stringToInteger(n1,radix);
    long long maxRadix=target+1;//最大的进制
    long long minRadix=0;
    //找出下界
    for(int i=0;n2[i]!='\0';i++){
        if(n2[i]>='0'&&n2[i]<='9'){
            minRadix=minRadix<(n2[i]-'0'+1)?(n2[i]-'0'+1):minRadix;
        }else if(n2[i]>='a'&&n2[i]<='z'){
            minRadix=minRadix<(n2[i]-'a'+11)?(n2[i]-'a'+11):minRadix;
        }
    }
    long long mid,end_radix;
    while(minRadix<=maxRadix){
        mid=minRadix+(maxRadix-minRadix)/2;
        long long result=stringToInteger(n2,mid);
        if(result==-1||result>target){//进制太大
            maxRadix=mid-1;
        } else if(result<target){
            minRadix=mid+1;
        } else {
            printf("%d",mid);
            return 0;
        }
    }
    printf("Impossible");
    return 0;
}

这里是参考了别人的代码。简述下思路,首先将其中一个数转换为10进制数,转换后的数+1是上界,下界是n2中最大的那一项+1。然后因为范围很大,所以要二分查找。在转换10进制数时,要考虑进制过大时,long long可能会溢出。

### 关于1010 Radix测试点的技术含义及用途 对于特定标记为“1010 Radix”的测试点,在计算机科学领域内通常涉及的是基数(Radix)的概念,这主要关联到数据表示形式以及算法设计中的数制转换。然而,“1010”作为一个二进制字符串可以直接被解释为十进制下的数值10;当提到“1010 Radix”,可能是指基于不同进制间相互转化的一种测试案例。 #### 基数概念解析 在信息技术里,基数指的是某个计数系统的底数或基础。例如: - **二进制** (Binary): 使用0和1两个符号,其基数为2; - **八进制** (Octal): 使用0至7八个符号,基数为8; - **十进制** (Decimal): 日常生活中常用的数字系统,使用0到9十个符号,基数为10; - **十六进制** (Hexadecimal): 计算机编程中常用,除了0-9外还加入了A-F六个字母作为额外的记号,因此基数为16。 针对“1010 Radix”这一表述,如果将其视为一个特殊的测试场景,则可能是为了验证程序能否正确处理来自多种进制的数据输入,并确保这些数据能够在不同的基数之间准确无误地互相转换[^1]。 #### 实际应用场景举例 考虑如下Python代码片段用于展示如何实现简单的多进制间的转换功能: ```python def convert_base(number_str, from_radix=10, to_radix=10): """Convert a string representing an integer in one base to another.""" decimal_value = int(number_str, from_radix) result = '' while decimal_value > 0: remainder = decimal_value % to_radix if remainder >= 10: # Convert numbers above 9 into corresponding letters A-Z. char = chr(ord('A') + remainder - 10) else: char = str(remainder) result = char + result decimal_value //= to_radix return '0' if not result else result print(convert_base('1010', 2, 10)) # Output should be "10" ``` 此函数`convert_base()`可以接收三个参数:待转换的原始数值串、源基数(`from_radix`)以及目标基数(`to_radix`)。通过调用内置的`int()`函数先将给定的字符串按照指定的原生基数转成内部统一使用的十进制整型值,之后再依据目的基数逐步构建新的表达方式直至完成整个过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值