pta-1010Radix(迭代器*&&二分查找&&进制转换)

1010 Radix (25)(25 分)

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:\ N1 N2 tag radix\ Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number "radix" is the radix of N1 if "tag" is 1, or of N2 if "tag" is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print "Impossible". If the solution is not unique, output the smallest possible radix.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

 【分析】刚开始想把所有的数转换为10进制,然后比较十进制数是否相等即可。但是定义的是字符数组,写得很麻烦,最后部分正确。而且2开始一个个进制试下去的话肯定会超时,所以二分法。

下面是我在别的博主那看到的代码,感觉跟我的思路一样但是比我好太多了好嘛!!感觉写的超棒了。差距啊

https://blog.csdn.net/liuchuo/article/details/52495925

#include<bits/stdc++.h>
using namespace std;
long long convert(string n,long long r)//转换为十进制
{
	long long sum=0;
	int index=0,temp=0;
	for(auto it=n.rbegin();it!=n.rend();it++)
	{
		temp=isdigit(*it)?*it-'0':*it-'a'+10;
		sum+=temp*pow(r,index++);
	}
	return sum;
}
long long find_r(string n,long long num)//找到令两个数相同的进制数
{
	char it=*max_element(n.begin(),n.end());
	long long low=(isdigit(it)?it-'0':it-'a'+10)+1;
	long long high=max(num,low);
	while(low<=high){
		long long mid=(low+high)/2;
		long long t=convert(n,mid);
		if(t<0||t>num)high=mid-1;
		else if(t==num)return mid;
		else low=mid+1;
	}
	return -1;
}
int main()
{
	string n1,n2;
	long long tag=0,r=0,rr;
	cin>>n1>>n2>>tag>>r;
	rr=tag==1?find_r(n2,convert(n1,r)):find_r(n1,convert(n2,r));
	if(rr!=-1)cout<<rr;
	else cout<<"Impossible";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81700216
今日推荐