确定进制(
OpenJudge1973 && POJ1331
)
总时间限制 : 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 。
输入
一行, 包含三个整数 p 、 q 、 r , 相邻两个整数之间用单个空格隔开。 p 、 q 、 r
的所有位都是数字, 并且 1 <= p 、 q 、 r <= 1,000,000 。
输出
一个整数: 即使得 p * q = r 成立的最小的 B 。 如果没有合适的 B , 则输出 0 。
样例 1 输入
6 9 42
样例 1 输出
13
样例 2 输入
2 2 2
样例 2 输出
0 提
示: 经过计算, 可以确定 B 是小于 17 的
分析: 我们只需要从小到大枚举所有的进制 B , 如果当前的 B 可以满足等式, 就
输出 B , 如果一直到了 17 还没有答案, 那么就输出 0. 进制的转换也是需要注意
总时间限制 : 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 。
输入
一行, 包含三个整数 p 、 q 、 r , 相邻两个整数之间用单个空格隔开。 p 、 q 、 r
的所有位都是数字, 并且 1 <= p 、 q 、 r <= 1,000,000 。
输出
一个整数: 即使得 p * q = r 成立的最小的 B 。 如果没有合适的 B , 则输出 0 。
样例 1 输入
6 9 42
样例 1 输出
13
样例 2 输入
2 2 2
样例 2 输出
0 提
示: 经过计算, 可以确定 B 是小于 17 的
分析: 我们只需要从小到大枚举所有的进制 B , 如果当前的 B 可以满足等式, 就
输出 B , 如果一直到了 17 还没有答案, 那么就输出 0. 进制的转换也是需要注意
的, 且不需要高精度计算。
附AC码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int a[10001]={0};
int b[10001]={0},kk;
void jinwei(int y){
for(int i=1;i<=kk;i++)
if(b[i]>=y){
b[i]-=y;
b[i+1]++;
kk=kk>i+1?kk:i+1;
}
else
return ;
}
int main(){
int i,j=0,k,m,n,u,v,flag=0;
scanf("%d%d%d",&n,&m,&k);
while(k>0){
j++;
a[j]=k%10;
k/=10;
}kk=1;
for(i=2;i<17;i++){
for(j=1;j<=m;j++){
b[1]+=n;
jinwei(i);
}
for(j=1;j<=kk;j++){
if(b[j]!=a[j]){
for(u=1;u<=kk;u++)
b[u]=0;
flag=1;
}
}
for(u=1;u<=kk;u++)
b[u]=0;
if(flag==1){
flag=0;
continue;
}
v=i;
break;
}
printf("%d\n",v);
return 0;
}