现在的位置: 首页 > 综合 > 正文

确定进制(经典水题)

2017年10月13日 ⁄ 综合 ⁄ 共 968字 ⁄ 字号 评论关闭

问题描述: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;
}

抱歉!评论已关闭.