正文

【原创】PKU1331解题报告(源代码)2009-01-17 14:02:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bclz/40541.html

分享到:

PKU1331代码

题意:6*9 = 42" is not true for base 10, but is true for base 13. That is, 6(13) * 9(13) = 42(13) because 42(13) = 4 * 

131 + 2 * 130 = 54(10).

You are to write a program which inputs three integers p, q, and r and determines the base B (2<=B<=16) for which p * q 

= r. If there are many candidates for B, output the smallest one. For example, let p = 11, q = 11, and r = 121. Then we 

have 11(3) * 11(3) = 121(3) because 11(3) = 1 * 31 + 1 * 30 = 4(10) and 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10). For 

another base such as 10, we also have 11(10) * 11(10) = 121(10). In this case, your program should output 3 which is the 

smallest base. If there is no candidate for B, output 0.

给三个数 p,q,r 从2到16中找出一个进制,使得r为p与q的乘积.
题目隐含要求:1、进制不能小于p,q,r里边包含的最大数字.
         2、输入为10进制。
解题过程:
    给定一个base,先将pqr转换成10进制数,然后进行计算。
    



#include <iostream>
#include <cstdlib>
#include <stack>

using namespace std;

int basecalc(int p,int q,int r,int base)
{
    stack <int> s;
    int pinten=0,qinten=0,rinten=0;
    
    while(p)
    {
        s.push(p%10);
        p/=10;
    }
    while(!s.empty())
    {
        pinten=pinten*base+s.top();
        s.pop();
    }
    while(q)
    {
        s.push(q%10);
        q/=10;
    }
    while(!s.empty())
    {
        qinten=qinten*base+s.top();
        s.pop();
    }
    while(r)
    {
        s.push(r%10);
        r/=10;
    }
    while(!s.empty())
    {
        rinten=rinten*base+s.top();
        s.pop();
    }
    
    if(pinten*qinten==rinten)
        return base;
    else
        return 17;
}

int main()
{
    int t;
    int p,q,r;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        int base=0;
        int max=0;
        int min=17;
        cin>>p>>q>>r;
        int pp=p,qq=q,rr=r;
        while(pp)
        {
            if(max<pp%10)
                max=pp%10;
            pp/=10;
        }

        while(qq)
        {
            if(max<qq%10)
                max=qq%10;
            qq/=10;
        }

        while(rr)
        {
            if(max<rr%10)
                max=rr%10;
            rr/=10;
        }

        for(base=max+1;base<=16;base++)
        {
            int mm=basecalc(p,q,r,base);
            if(min>mm)
                min=mm;
        }
        if(min==17)
            cout<<0<<endl;
        else
            cout<<min<<endl;
    }
    
    return EXIT_SUCCESS;
}

阅读(1509) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册