确定进制(经典水题)

来源:互联网 发布:淘宝的伞黑胶都在外面 编辑:程序博客网 时间:2024/05/20 20:47

问题描述:6*9=42 对十进制来说是错误的 但是对13进制来说却是正确的 即6(13)*9(13)=42(13)

42(13)=4*13+2*1=54;你的任务是编写一段程序 读入3个整数,p,q和r 然后确定一个进制B(2<=B<=16),使得p*q=r。如过B有很多选择 则输出最小的那个进制

如果没有合适的进制,则输出0

输入:

输入有t组数据,t在第一行给出。1《=p,q,r<=1000000;

输出:

对于每一次测试样例输出第一行。该行包含一个整数:即令p*q=r成立的最小的B

输入样例:

3

6 9 42

11 11 121

2 2 2

输入样例

13

3

0

思路:先假设等式为B进制,讲三个数先转换为十进制,利用十进制的乘法计算等式左边的结果,在与十进制的r进行比较,找到相应的B值;若不相等则取B=B+1再来一遍。若B>16,则说明没有合适的进制能使等式成立

技巧:

B不一定要从2开始遍历 由r=n%k我们可以知道 r一定是要小于k的 所我们只需要找到表达式三个数所含数字中最大的那个值,B则从那个值+1开始遍历

#include<stdio.h>int max_num(int n){    int max=0;    while(n)    {        int k=n%10;        if(k>max)            max=k;        n/=10;    }    return max;}int ic_xy(int n,int p){    int k=1,r;    int sum=0;    while(n)    {        r=n%10;        n/=10;        sum+=r*k;        k*=p;    }    return sum;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        int amax,bmax;        amax=max_num(a);        bmax=max_num(b);        if(bmax>amax)            amax=bmax;        bmax=max_num(c);        if(bmax>amax)            amax=bmax;        int da,db,dc;//10进制的a、b        for(amax++;amax<=16;amax++)        {            da=ic_xy(a,amax);            db=ic_xy(b,amax);            dc=ic_xy(c,amax);            if(da*db==dc)                break;        }        if(amax>16)            amax=0;        printf("%d\n",amax);    }    return 0;}


1 0
原创粉丝点击