洛谷B2141 确定进制

确定进制

题目描述

6   × 9 = 42 6\ \times 9=42 6 ×9=42 对于十进制来说是错误的,但是对于 13 13 13 进制来说是正确的。即 6 ( 13 )   × 9 ( 13 ) = 4 2 ( 13 ) 6_{(13)}\ \times 9_{(13)}=42_{(13)} 6(13) ×9(13)=42(13),而 4 2 ( 13 ) = 4   × 1 3 1 + 2   × 1 3 0 = 5 4 ( 10 ) 42_{(13)}=4\ \times 13^1+2\ \times 13^0=54_{(10)} 42(13)=4 ×131+2 ×130=54(10)

你的任务是写一段程序读入三个整数 p , q p,q p,q r r r,然后确定一个进制 B ( 2 ≤ B ≤ 16 ) B(2 \le B \le 16) B(2B16) 使得 p   × q = r p\ \times q=r p ×q=r。如果 B B B 有很多选择,则输出最小的一个。

例如: p = 11 , q = 11 , r = 121 p=11,q=11,r=121 p=11,q=11,r=121,则有 1 1 ( 3 )   × 1 1 ( 3 ) = 12 1 ( 3 ) 11_{(3)}\ \times 11_{(3)}=121_{(3)} 11(3) ×11(3)=121(3),因为 1 1 ( 3 ) = 1   × 3 1 + 1   × 3 0 = 4 ( 10 ) 11_{(3)}=1\ \times 3^1+1\ \times 3^0=4_{(10)} 11(3)=1 ×31+1 ×30=4(10) 12 1 ( 3 ) = 1   × 3 2 + 2   × 3 1 + 1   × 3 0 = 1 6 ( 10 ) 121_{(3)}=1\ \times 3^2+2\ \times 3^1+1\ \times 3^0=16_{(10)} 121(3)=1 ×32+2 ×31+1 ×30=16(10)。对于进制 10 , 10, 10, 1 1 ( 10 )   × 1 1 ( 10 ) = 12 1 ( 10 ) 11_{(10)}\ \times 11_{(10)}=121_{(10)} 11(10) ×11(10)=121(10)。这种情况下,应该输出 3 3 3。如果没有合适的进制,则输出 0 0 0

输入格式

一行,包含三个整数 p , q , r p,q,r p,q,r,相邻两个整数之间用单个空格隔开。

输出格式

一个整数:即使得 p × q = r p \times q=r p×q=r 成立的最小的 B B B。如果没有合适的 B B B,则输出 0 0 0

样例 #1

样例输入 #1

6 9 42

样例输出 #1

13

提示

p , q , r p,q,r p,q,r 的所有位都是数字,并且 1 ≤ p , q , r ≤ 1 0 6 1 \le p,q,r \le 10^6 1p,q,r106

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
long long rev(long long m,long long i){
	long long j=0,sum=0;
	while(m!=0){
		sum+=(long long)((m%10)*pow(i,j));
		j++;
		m/=10;
	}
	return sum;
}//得出pqr所代表的十进制数字 
long long ma(long long n){
	long long max=-1;
	while(n!=0){
		if(n%10>max){
			max=n%10;
		}
		n/=10;
	}
	return max;
}//求数字位数的最大值 
long long max(long long m,long long n){
	if(m>n){
		return m;
	}
	else{
		return n;
	}
}//求出pqr之中每一位数字的最大值,作为求进制的起始点 
int main(){
	long long p,q,r,p1,q1,r1,flag=0,maxa;//flag作为标志位,没有找到则为0,否则为1 
	long long i,j,k;
	scanf("%lld%lld%lld",&p,&q,&r);
	maxa=max(max(ma(p),ma(q)),ma(r));
	for(i=maxa+1;i<=16;i++){
		p1=rev(p,i);
		q1=rev(q,i);
		r1=rev(r,i);
		if(p1*q1==r1){
			flag=1;
			break;
		}
	}
	if(flag==1){
		printf("%lld\n",i);
	}
	else{
		printf("%lld\n",0);
	}
	return 0;//CSDN:旺旺的碎冰冰~ 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺的碎冰冰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值