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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章