PAT 1010. Radix (25) 变态题,各种坑点
2017-09-16 19:48
381 查看
1010. Radix (25)
时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueGiven 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 radixHere 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 10Sample Output 1:
2Sample Input 2:
1 ab 1 2Sample Output 2:
Impossible
各种坑点。不想说话。注意爆栈是怎么处理的,注意二分法的上下界是怎么处理的。而且一定要注意要用getnum2,不能用getnum1。
个人猜测是因为getnum2爆栈的话爆的是sum,sum会正确的变负数。而getnum1的话,k爆栈后下一次sum+=k*a[i]可能还是正数,这就不对了。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include<string>#include<string.h>using namespace std;long long getnum1(int radix,string a){long long sum=0;int k=1;for(int i=a.size()-1;i>=0;i--){if(a[i]<='9'&&a[i]>='0')sum+=k*(a[i]-'0');else sum+=k*(a[i]-'a'+10);k*=radix;}return sum;}long long getnum2(int radix,string a){long long sum=0;for(int i=0;i<a.size();i++)if(a[i]<='9'&&a[i]>='0')sum=sum*radix+(a[i]-'0');else sum=sum*radix+(a[i]-'a'+10);return sum;}long long getminn(string s){int maa=-1;for(int i=0;i<s.size();i++){if(s[i]<='9'&&s[i]>='0'&&(s[i]-'0')>maa )maa=s[i]-'0';if(s[i]<='z'&&s[i]>='a'&&(s[i]-'a'+10)>maa )maa=s[i]-'a'+10;}return maa+1;}int main(){string a,b;cin>>a>>b;long long tag,radix;cin>>tag>>radix;if(tag==2) swap(a,b);long long target=getnum2(radix,a);long long head=getminn(b);long long tail=target+1;long long now;int flag=0;long long minn;while(head<=tail){now=(head+tail)/2;long long zz=getnum2(now,b);if(zz>target||zz<=0){tail=now-1;}else if(zz<target){head=now+1;}else{flag=1;break;}}if(flag==0) cout<<"Impossible";else cout<<now;return 0;}
相关文章推荐
- 1010. Radix (25)——PAT (Advanced Level) Practise
- 【PAT甲级】1010. Radix (25)
- PAT-1010. Radix (25)
- 1010. Radix (25) PAT 甲级
- PAT 1010. Radix (25)
- PAT习题解:1010. Radix (25)
- pat 甲级 1010. Radix (25)
- PAT_A 1010. Radix (25)
- PAT甲级-1010. Radix (25)进制
- PAT甲级1010. Radix (25)
- 1010. Radix (25)(PAT甲)
- PAT (Advanced Level) Practise 1010. Radix (25) C++
- PAT 解题报告 1010. Radix (25)
- PAT甲级1010 . Radix (25)
- PAT-1010 Radix (25)
- PAT甲题题解-1010. Radix (25)-二分搜索
- pat 1010. Radix (25)
- PAT-A 1010. Radix (25)
- PAT (Advanced Level) Practise 1010 Radix (25)
- PAT 甲级 1010. Radix (25)