确认进制

【题目描述】

6*9=42对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13)* 9(13)= 42(13), 而 42(13)=4*131+2*130=54(10)。

你的任务是写一段程序,读入三个整数p、q和 r,然后确定一个进制 B(2≤B≤40) 使得 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。

【输入样例】

6 9 42

【输出样例】

13

分析:此题难点在于进制转换,搞定这个这题就搞定了

枚举2~40进制中成立的情况,已知求最小,一个for2~40依次枚举得到成立则输出+return 0

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int p,q,r,sum;
int lll(int j,int jz);
int lll(int j,int jz)//将 j 转换为jz 进制
{
	int k=1,a=j,b=0;
	while(a!=0)
	{
		b=b+k*(a%10);
		k=k*jz;
		a=a/10;
	}
	return b;
}
int main(){
	scanf("%d %d %d",&p,&q,&r);//输入
	for(int i=2;i<=40;i++)//枚举所有进制
	{
		if(lll(r,i)==lll(p,i)*lll(q,i))
		{
			printf("%d",i);//输出
			return 0;
		}
	}
	printf("0");//无解,输出“0”
}

猜你喜欢

转载自blog.csdn.net/wallyIII/article/details/82714575
今日推荐