B2141 确定进制

题目描述

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;	
} 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值