poj 1331 Multiply

// 题意: 在b(2<=b<=16)进制下,p*q是否等于r,找出满足条件的最小b. 可以把三个数先转化成十进制,再来比较
#include <iostream>

#include <string>
using namespace std;
int base(int n) //返回能表示n的最小进制b
{

char s[10];
sprintf(s,"%d",n);
int b=0;
for(int i=0;i<strlen(s);++i)
b = s[i]-'0' > b ? s[i]-'0':b;
return b+1;
}
__int64 to_Dec(int n,int b) //b进制数n转化成十进制
{

char s[10];
sprintf(s,"%d",n);
__int64 ans=0;
for(int i=0;i<strlen(s);++i)
{
ans=b*ans+s[i]-'0';
}
return ans;
}
int main()
{
int cases,p,q,r;
cin>>cases;
while(cases--)
{
cin>>p>>q>>r;
int b=max(base(p),max(base(q),base(r))); //从最小进制b开始枚举
int ok=0;

while(b<=16)
{
if(to_Dec(p,b)*to_Dec(q,b)==to_Dec(r,b)) //中间相乘结果可能超int范围
{

printf("%d\n",b);
ok=1;
break;
}
b++;
}
if(!ok)
printf("0\n");
}
return 0;
}

posted on 2011-07-22 19:07  sysu_mjc  阅读(197)  评论(0编辑  收藏  举报

导航