Radix

1010 Radix (25)(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

题目大意:给定两个数,并给出其中一个的基数,求另一个数以什么为基数可以等于这个数,如果有输出最小值,否则,输出impossible;

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
string a,b,c;
ll s,sc;
int trans(char c)
{
    int a;
    if(c>='0'&&c<='9')
        a=c-'0';
    if(c>='a'&&c<='z')
        a=c-'a'+10;
    return a;
}
ll binary(ll low,ll high)
{
    while(low<high)
    {
        ll mid=(low+high)/2;
        sc=0;
        for(int j=c.size()-1,x=1;j>=0;j--,x*=mid)
        {
           sc+=trans(c[j])*x;
           if(sc>s)
            break;
        }
        if(sc==s)
            return mid;
        else if(sc>s)
            high=mid-1;
        else
            low=mid+1;
    }
    return 0;
}
int main()
{
    int tag,radix;
    ll flag=0;
    s=0;
    cin>>a>>b>>tag>>radix;
    if(tag==1)
    {
        c=b;
        for(int i=a.size()-1,x=1;i>=0;i--,x*=radix)
            s+=trans(a[i])*x;
    }
    else
    {
        c=a;
        for(int i=b.size()-1,x=1;i>=0;i--,x*=radix)
            s+=trans(b[i])*x;
    }
    radix=0;
    for(int i=0;i<c.size();i++)
        radix=max(radix,trans(c[i]));
    for(int i=radix+1;i<=100;i++)
    {
        sc=0;
        for(int j=c.size()-1,x=1;j>=0;j--,x*=i)
           sc+=trans(c[j])*x;
        if(s==sc)
        {
            flag=i;
            break;
        }
        if(i==100)
        {
            flag=binary(100,s+1);
        }
    }
    if(flag!=0)
        cout<<flag<<endl;
    else
        cout<<"Impossible"<<endl;
    return 0;
}

 

<think>我们正在讨论Java包装类的parse方法及其radix参数。用户希望了解parse方法与radix参数的关系和使用说明。根据引用[1],我们看到Integer.valueOf方法内部调用了parseInt方法,并传递了radix参数。实际上,parseInt方法就是用来解析字符串为整数的核心方法,而radix参数表示进制基数。引用[2]提供了一些包装类的背景知识,并给出了一个关于Integer缓存和比较的示例。虽然这个示例主要讨论的是对象比较和缓存,但它也提到了包装类的一个基本用途:作为与基本数据类型对应的类类型,并包含相关操作方法。现在,我们专注于parse方法和radix参数。在Java中,包装类(如Integer、Long等)提供了一些静态方法,用于将字符串解析为对应的基本数据类型。其中,parseInt、parseLong等方法都支持radix参数。radix参数表示进制基数,范围通常在2到36之间(因为数字0-9加上字母a-z或A-Z总共36个字符)。例如:-radix=10:表示十进制(默认)-radix=16:表示十六进制-radix=2:表示二进制当调用parseInt(Strings,intradix)时,方法会按照指定的radix来解析字符串s。如果radix不在合法范围内,会抛出异常。使用示例:```javaintnum1=Integer.parseInt("1010",2);//二进制,解析为10intnum2=Integer.parseInt("A",16);//十六进制,解析为10intnum3=Integer.parseInt("10");//默认十进制,解析为10```注意事项:1.如果字符串包含超出radix所表示范围的字符,会抛出NumberFormatException。2.radix必须处于Character.MIN_RADIX(2)和Character.MAX_RADIX(36)之间,否则也会抛出异常。3.字符串可以以正负号开头(+或-),然后是数字字符。对于大于10的进制,字母不区分大小写。另外,包装类也提供了无radix参数的方法,默认使用十进制。例如:Integer.parseInt("123")。对于其他包装类,如Long、Short、Byte等,也有类似的parse方法,使用方式相同。总结:-parse方法(如parseInt)用于将字符串解析为基本数据类型。-radix参数指定字符串所表示的数值的进制基数,范围在2~36之间。-如果不指定radix,则默认使用十进制。§§相关问题§§1.如果radix参数超出2~36的范围会怎样?2.如何解析带有正负号的字符串?3.除了Integer,还有哪些包装类提供了带radix参数的parse方法?</think>### Java包装类parse方法与radix参数使用说明 在Java包装类中,`parse`方法(如`Integer.parseInt()`)用于将字符串转换为对应的基本数据类型。**`radix`参数指定字符串的进制基数**,它决定了字符串中的字符应如何解释为数字值。以下是核心使用规则: #### 1. radix参数的作用 - **定义数值进制**:radix指定字符串的进制基数,范围在`Character.MIN_RADIX(2)`到`Character.MAX_RADIX(36)`之间 - **字符映射规则**: - radix≤10时:仅允许字符`'0'`到`radix-1`(如radix=8时,字符范围`0-7`) - radix>10时:额外允许字母`a-z`或`A-Z`(如radix=16时,`'A'`映射到10) - **默认行为**:省略radix时默认使用十进制(radix=10) #### 2. 使用语法示例 ```java // 二进制解析 (radix=2) int bin = Integer.parseInt("1010", 2); // 结果: 10 // 十六进制解析 (radix=16) int hex = Integer.parseInt("FF", 16); // 结果: 255 // 三十二进制解析 (radix=32) int tri = Integer.parseInt("V8", 32); // 结果: 1000 ``` #### 3. 关键规则 1. **范围限制**: ```java // 合法调用 (radix在2-36之间) int val = Integer.parseInt("11", 8); // 八进制 → 9 // 非法调用 (radix=37) int err = Integer.parseInt("Z", 37); // 抛出NumberFormatException ``` 2. **字符有效性**: ```java // 有效字符示例 (radix=16) int ok = Integer.parseInt("1F", 16); // 31 // 无效字符示例 (radix=10时出现'A') int fail = Integer.parseInt("12A3", 10); // 抛出异常 ``` 3. **符号处理**: - 支持首字符为`+`或`-`(表示正负数) ```java int negative = Integer.parseInt("-1010", 2); // -10 ``` #### 4. 支持该方法的包装类 | 包装类 | 方法签名 | 返回类型 | |--------------|-----------------------------------|----------| | `Integer` | `parseInt(String s, int radix)` | `int` | | `Long` | `parseLong(String s, int radix)` | `long` | | `Short` | `parseShort(String s, int radix)` | `short` | | `Byte` | `parseByte(String s, int radix)` | `byte` | | `BigInteger` | 构造函数支持radix | 对象 | #### 5. 异常处理 当出现以下情况时抛出`NumberFormatException`: - 字符串包含超出radix范围的字符 - 字符串为空或全空白 - radix超出[2,36]范围 - 数值超出目标类型范围(如`Integer.parseInt("9999999999")`) > **典型应用场景**:处理不同进制的用户输入、解析二进制/十六进制文件数据、网络协议解码等[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值