1010 Radix(二分)

1010 Radix (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 N​1​​ and N​2​​, 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

 这道题目好像看别人说是有一点问题,我就从中学习吧,也不说这道题目哪里不好。首先,我平时的代码的书写就很乱,平时不喜欢写函数,导致代码量太多,看着很不清晰,要写函数,减少代码量,将代码最清晰的展现出来。

这道题目,一开始就是使用暴力的方法,然后出现超时的样例,最后写了一个二分才AC的,题目挺简单的,只要自信一点就可以过的。

#include<iostream>
#include<bits/stdc++.h>
const int maxn=1005;
using namespace std;
typedef long long ll;

ll strnum(string n,ll rad)
{
	ll shu=0;
	ll inde=0;
	for(auto it=n.rbegin();it!=n.rend();it++)
		shu+=(isalpha(*it)?*it-'a'+10:*it-'0')*pow(rad,inde++);
	return shu;
}
ll find_rad(ll rad,string yizhi,string buzhi)
{
	ll ans=-1;
	ll shu=0;
	ll index=0;
	for(auto it=yizhi.rbegin();it!=yizhi.rend();it++)
		shu+=(isalpha(*it)?(*it-'a'+10):(*it-'0') )*pow(rad,index++);
	char zimu=*max_element(buzhi.begin(),buzhi.end());
	ll left= ( isalpha(zimu)? zimu-'a'+10:zimu-'0') +1;
	ll right=max(left,shu);
	ll mid;
	while(left<=right)
	{
		mid=(left+right)/2;   
		ll num=strnum(buzhi,mid);
		if(num<0||num>shu)
			right=mid-1;
		else if(num<shu)
			left=mid+1;
		else
		{
			ans=mid;
			break;
		}
	}
	return ans;
}
int main()
{
	string n1,n2;
	ll tag,rad;
	cin>>n1>>n2>>tag>>rad;
	ll ans= (tag==1? find_rad(rad,n1,n2):find_rad(rad,n2,n1));
	if(ans==-1)
		cout<<"Impossible"<<endl;
	else
		cout<<ans<<endl;
	return 0;
}

还有一些STL操作使得代码量更小,在一个容器中找到一个最大值,也可以得到他的位置,使得代码量变少。

发布了123 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tsam123/article/details/100767920