PAT甲级 1010 Radix (25分)

这道题还是很值得思考的,坑点也很多。一开始思路很乱,瞎写了一番之后,只能拿到13分,看了 这位博主 的解法之后,才有了思路,所以代码差不太多,在我这看不懂的也可以去他那试试。还有要注意的是对于可能出现的大数据处理都用long long好了,被坑太多次了。

#include<bits/stdc++.h>
using namespace std;
long long translate(string s,long long k)
{
	long long num = 0;
	for(int i=0;i<s.length();i++)    //进制转换 
	{
		if(s[i]>='0'&&s[i]<='9')  
		num += pow(k,s.length()-1-i)*(s[i]-'0');   
		else
		num += pow(k,s.length()-1-i)*(s[i]-'a'+10);
	}
	return num;
}
main()
{
	string s1,s2;
	int tag,radix; 
	cin>>s1>>s2>>tag>>radix;
	if(tag == 2)           // 这里如果s2需要处理,直接s1,s2互换位置,就不用后面再if处理了 
	{
		string temp = s1;
		s1 = s2;
		s2 = temp;
	}
	long long out = translate(s1,radix);
	int strmax = -1;
	for(int i=0;i<s2.length();i++)         //找出各位数字中最大的
	{
		if(s2[i]>='0'&&s2[i]<='9')
		{
			if(s2[i]-'0'> strmax)
			strmax = s2[i] - '0';
		}
		else
		{
			if(s2[i]-'a'+10 > strmax)
			strmax = s2[i]-'a'+10;
		}
	}
	long long down = strmax + 1;  //因为进制不可能比最大数字小。 所以下限就是最大数字+1 
	long long up = max(down,out); //上限就是转换后的out自身,但可能出现out比下限还小的的情况,所以要特别处理。 
	while(down <= up)          //下面就是常规二分法处理了 
	{
		long long mid = (down+up) / 2; 
		long long res = translate(s2,mid);
		if(res == out)
		{
			printf("%d",mid);
			return 0;
		}
		else if(res > out || res<0)
		{
			up = mid- 1;
		}
		else if(res<out)
		{
			down = mid + 1;
		}
	}
	printf("Impossible");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章