OpenJudge 2972(确定进制)
- 时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10) 和 121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。 对于进制 10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
- 输入
- 输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。
- 输出
- 对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。
- 样例输入
-
3 6 9 42 11 11 121 2 2 2
- 样例输出
-
13 3 0
//做这道题就有一个体会,pow函数至少在混合处理时会有问题 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int vis[35]; int vis_temp1[35]; int vis_temp2[35]; int max; long long My_Pow(int m,int n) { int i; int ans=1; m=(long long)m; for(i=1;i<=n;i++) ans*=m; return ans; } long long fun(int num,int factor,int *a)//求新数 { int i=0,j,k; long long temp,ans; while(num>0) { a[i]=num%10; if(a[i]>max) max=a[i]; num/=10; i++; } ans=0; for(j=0;j<i;j++) { // temp=(int)pow((double)factor,(double)j);,此时13^1=12,明显错误,只能自己写了一个 temp=My_Pow(factor,j); // printf("temp=%d\n",temp); ans+=a[j]*temp; } return ans; } int main() { int i,j,k,T; int p,q,r,temp; long long k1,k2,num1,num2; scanf("%d",&T); while(T--) { memset(vis_temp1,0,sizeof(vis_temp1)); memset(vis_temp2,0,sizeof(vis_temp2)); memset(vis,0,sizeof(vis)); scanf("%d%d%d",&p,&q,&r); max=0; k1=k2=0; for(i=2;i<=16;i++) { k1=fun(p,i,vis_temp1); k2=fun(q,i,vis_temp2); num1=k1*k2; num2=fun(r,i,vis); // printf("k1=%d k2=%d num2=%d max[0]=%d\n",k1,k2,num2,max); if(num1==num2&&i>max) break; } if(i>16) printf("0\n"); else printf("%d\n",i); } return 0; }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.