相邻数字的基数等比:确定进制

  1. 问题描述
    6 X 9 =42 对于十进制来说是错误的,但是对于二进制来说是正确的。即6(13) X 9(13) = 42(13),而42(13) = 4 X 13^1 + 2 X 13^0 = 54(10)。你的任务就是写一段程序读入3个整数p、q 和 r,然后确定一个进制B(2<=B<=16)使得p X q = r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) X 11(3) = 121(3),因为11(3) = 1 X 3^1 + 1 X 3^0 = 4(10) 和 121(3) = 1 X 3^2 + 2 X 3^1 +1 X 3^0 = 16(10)。对于十进制,有11(10) X 11(10) = 121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。

  2. 输入数据
    输入有T组测试样例。T在第一行给出。每一组测试样例占一行,包含3个整数p、q、r。p、q、r的所有位都是数字,并且1<=p、q、r<=1 000 000。

  3. 输出要求
    对于每个测试样例输出一行。该行包含一个整数:即使得p x q = r成立的最小的B。如果没有合适的B,则输出0.

  4. 输入样理
    3
    6 9 42
    11 11 121
    2 2 2

  5. 输出样例
    13
    3
    0

  6. 解题思路
    此问题很简单。选择一个进制B,按照该进制将被乘数、乘数、乘积分别转换成十进制,然后判断等式是否成立。使得等式成立的最小B就是所求的结果。
    分别用一个字符型数组存储p、q、r 的各位数字字符。先以字符串的方式读入p、q、r,然后按不同的进制将它们转换成十进制数,判断是否相等。

  7. 参考程序

include<stdio.h>
include<string.h>

long b2ten(char* x, int b){         //x字符数组值,b进制的参数,功能是b进制转换为十进制数ret
    int ret = 0;
    int len = strlen(x);
    for(int i = 0; i < len; i++){
        if (x[i] - '0' >= b) return -1;
        ret *= b;
        ret +=x[i] - '0';
    }
    return (long)ret;
}

void main(){
    int n;
    char p[8],q[8],r[8];
    long pAlgorism, qAlgorism, rAlgorism;
    scanf("%d",&n);
    while(n--){
        scanf("%s%s%s",p,q,r);
        for(int b = 2;b <= 16; b++) {
            pAlgorism = b2ten(p,b);
            qAlgorism = b2ten(q,b);
            rAlgorism = b2ten(r,b);
            if(pAlgorism == -1 || qAlgorism == -1 || rAlgorism == -1) continue;
            if(pAlgorism * qAlgorism == rAlgorism) {
                printf("%d\n",b);
                break;
            }
        }
        if(b == 17) printf("0\n");
    }
}

常见错误

1. 在数制b(2<=b<=16)的表示中,每一位上的数字一定都比b小。每读入一组数据后,需要根据其中的数字,判断b的下限。在参考程序的b2ten 函数中,如果字符串x中存储的数字比b大、或者与b相等,则返回-1,表明:按照数制b,x中存储的表示形式是非法的,因此b不可能是所求的值。
2. 检查:在为找到合适的 b 时,是否输出0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值