题目描述
6 ×9=42对于十进制来说是错误的,但是对于 13进制来说是正确的。即 6(13) ×9(13)=42(13),而 42(13)=4 ×13^1+2 ×13^0=54(10)。
你的任务是写一段程序读入三个整数 p,q 和 r,然后确定一个进制 𝐵(2≤𝐵≤16)B(2≤B≤16) 使得 𝑝 ×𝑞=𝑟。如果 𝐵有很多选择,则输出最小的一个。
例如:𝑝=11,𝑞=11,𝑟=121则有 11(3) ×11(3)=121(3),因为 11(3)=1 ×3^1+1 ×3^0=4(10) 和 121(3)=1 ×3^2+2 ×3^1+1 ×3^0=16(10)。对于进制 10,, 有 11(10) ×11(10)=121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
输入格式
一行,包含三个整数 𝑝,𝑞,𝑟,相邻两个整数之间用单个空格隔开。
输出格式
一个整数:即使得 𝑝×𝑞=𝑟成立的最小的 𝐵。如果没有合适的 𝐵,则输出 0。
输入输出样例
输入 #1复制
6 9 42
输出 #1复制
13
说明/提示
𝑝,𝑞,𝑟 的所有位都是数字,并且 1≤𝑝,𝑞,𝑟≤10^6。
相信你们都看过题了,这里有坑,不止一个是两个(第一个是,题目中给你的数就是对应进制下的数,并不是10进制数,你不需要把它们先转化成其他进制下的数,再将它们转化为10进制数进行比较)(我开始就是这样,只能得75分,气死我了(T_T);第二个坑是,你所求得得数不能大于它本身的进制数,就以11*11=121为例,若你不加上约束条件,就会输出2,加上约束条件才能输出正确答案3,11(2)=3,121(2)就不对,因为是二进制就不可能出现2)
了解完这些,真的就特别简单,思路是先把在特殊进制下的数转化为10进制数,我用了一个调用函数,然后调用p,q,r求出对应的10进制下的数,然后避开上面的第二个坑就可以了,(手动标记一下就可以)上代码,真的简单,也不知道为啥洛谷上这道题的题解他们写的那么复杂
#include<iostream>
#include<cmath>
typedef long long ll;
using namespace std;
const int N=1e6+10;
bool mark;
int f (int x,int y)//x是传进去的值,y是进制数
{
ll sum = 0;
ll power = 1;
while (x)
{
int k=x%10;
if (k>=y)//判断求出来的数是否大于进制数的本身,就比如现在y=2,那么k就不能大于2
mark = true;
sum += k * power; //实现从其他进制转化为10进制数,就比如121(3)=1*3^0+2*3^1+1*3^2=16,
x /= 10;
power *= y; //为啥不用pow()函数,因为al说不合适,我就改了,结果是一样的,模拟一下
} //power=1,k=1,sum=1,-->,power=3,k=2,sum=7,-->power=9,k=1,sum=16
return sum;
}
int main()
{
int p,q,r,flag=0;
ll a,b,c;
cin>>p>>q>>r;
for(int i=2;i<=16;i++)
{
mark=false;
a=f(p,i),b=f(q,i),c=f(r,i);
//cout<<a<<" "<<b<<" "<<c<<"\n";
if(a*b==c&&mark==false)
{
cout<<i;
flag=1;
break;
}
}
if(flag==0) cout<<0;
return 0;
}