PAT甲级 1010 测试点

1010 Radix (25分)

  • 测试点0: n 1 , n 1 n_1,n_1 n1,n1相同;
  • 测试点7:二分法上界赢设置为已知数据+1,而不是已知数据
  • 测试点3,4 5,9,11:数据会超出 i n t int int型范围,改成 l o n g   l o n g long\ long long long即可
  • 测试点8,10,12,13,15,16: l o n g   l o n g long\ long long long同样会溢出,需要加上溢出判断,舍去即可
#include
using namespace std;

long long todigit(char c){
	long long digit;
	if('0'<=c && c<='9')digit=c-'0';
		else digit=c-'a'+10;
	return digit;
}

long long todecimal(string n1,int radix){
	long long num1=0;
	for(int i=0;i<n1.size();i++){
		long long digit=todigit(n1[i]);
		num1+=(digit*pow(radix,(n1.size()-1-i)));
		if(num1<0)return -1;
	}
	return num1;
}

int main(){
	string n1,n2,tag;
	int radix;
	cin>>n1>>n2>>tag>>radix;
	if(tag=="2")swap(n1,n2);
	long long num1=todecimal(n1,radix);
	
	long long l=2,r;
	for(int i=0;i<n2.size();i++)l=max(l,todigit(n2[i])+1);
	r=num1+1;
	while(l<=r){
		long long mid=(r+l)/2;
		//cout<
		if(todecimal(n2,mid)>num1 || todecimal(n2,mid)==-1)r=mid-1;
		else if(todecimal(n2,mid)<num1)l=mid+1;
		else if(todecimal(n2,mid)==num1){cout<<mid;return 0;}
	}
	cout<<"Impossible";
	return 0;
}

你可能感兴趣的:(PAT甲级刷题历程)