NOI 2.1.1973 确定进制 题解(C++)

确定进制 题解(C++)

嘿嘿嘿,又见面了。

在这里插入图片描述

这次的题目是有关枚举的题,so作者也是用枚举的方法来解决滴,这次代码有点长,不要在意哈。
不说了,请听题:

1973:确定进制

总时间限制: 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有很多选择, 输出最小的一个。如果没有合适的进制,则输出 0。

输入:
一行,包含三个整数p、q、r,相邻两个整数之间用单个空格隔开。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。

输出:
一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。
样例输入:
6 9 42

样例输出:
13

显而易见,此题可以使用枚举进制来处理,三个数的进制是一样的,所以很简单。处理这一题,必须要知道进制的概念和N进制转十进制代码,先谈谈进制吧:
所为进制,就是逢几进一,比如说我们日常计算就是十进制;一星期七天,是七进制;一分钟六十秒,是六十进制等等,巴特,在这世间上,没有零进制和一进制之说。

在这里插入图片描述
然后就没了哈哈哈哈哈哈哈哈哈。。。

---------------(一道普通的分界线)----------------

接着是进制转换,其实也不难,就是每次求除以10后的余数顺序压入一个数,然后原数除以10就可以了。
详细请看代码:

int r10(int j,int s){
	int q = 1,g,ans = 0;
	while(s!=0)
	{
		g = s%10;
		ans = ans+g*q;
		q*=j;
		s/=10;
	}
	return ans;
}

好了,详细代码已发送,请查收:

#include<iostream>
using namespace std;
int maxnum(int a,int b,int c){//3个数和2取最大数
	int maxx = a>b?a:b;
	maxx = maxx>c?maxx:c;
	maxx = maxx>2?maxx:2;//预防全0或全1
	return maxx; 
}
int f(int n){//书中取最大数位
	int maxx = 0;
	while(n){
		if(n%10>maxx){
			maxx = n%10;
		}
		n/=10;
	}
	return maxx;
}
int r10(int j,int s){//任意进制转十进制
	int q = 1,g,shi = 0;
	while(s!=0)
	{
		g = s%10;
		shi = shi+g*q;
		q*=j;
		s/=10;
	}
	return shi;
}
int main(){
	int a,b,c;
	cin>>a>>b>>c;
	int t = maxnum(f(a),f(b),f(c))+1;
	for(int i = t;i<=100000/*数不能太大*/;i++){
		if(r10(i,a)*r10(i,b) == r10(i,c)){
			cout<<i;
			return 0;
		}
	}
	cout<<0;//找不到
	return 0;
}

本题的解析到此结束。

发布了20 篇原创文章 · 获赞 1 · 访问量 470

猜你喜欢

转载自blog.csdn.net/jerry20183/article/details/104210184
今日推荐