PAT甲级 1010
2017-06-22 13:44
351 查看
Radix
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
首先需要判断输出radix的范围:
题意已经给了radix>digit
假设tag=1,那么题意暗含了radix<decimal(N1)。
否则此式成立:decimal(N2)>=decimal(N1)
如果等于的话,此时radix不是最小的
必定大于的话,也就没有判断的必要了
假设tag=1 题中没有给输入的radix一个范围,不知道decimal(N1)的最大值是多少。下面的代码是按照long long int范围来做的。
#include <iostream> #include <math.h> #include <algorithm> #include <string.h> #include <vector> #include <stdio.h> #include <queue> using namespace std; #define MAXSIZE 10+1 #define INF 0x7fffffff typedef long long ll; void tran(char n[]){ int len=0; while(n[len]!='\0'){ if(!(n[len]>='0' && n[len]<='9'))n[len]=n[len]-'a'+'0'+10; len++; } } ll getDecimal(char n[],ll radix,int len){ ll decimal=0; int i; for(i=0;i<len;i++){ decimal=decimal*radix+(n[i]-'0'); if(decimal<0)return -1; } return decimal; } int getMaxDigit(char n[]){ int m=0; int len=0; while(n[len]!='\0')m=max(m,n[len++]-'0'); return m+1; } ll work(char n[],ll value,int len){ ll low=(ll)getMaxDigit(n),high=max(value,low);//here ll mid=(low+high)/2,temp=-1; while(low<=high){ temp=getDecimal(n,mid,len); if(temp==value)break; else if(temp>value || temp==-1)high=mid-1; else low=mid+1; mid=(low+high)/2; } if(temp!=value) mid=-1; return mid; } int main(){ //freopen("./in","r",stdin); int tag; ll radix; char n1[MAXSIZE],n2[MAXSIZE]; scanf("%s %s %d %lld",n1,n2,&tag,&radix); tran(n1); tran(n2); if(tag!=1)swap(n1,n2); ll rst=work(n2,getDecimal(n1,radix,strlen(n1)),strlen(n2)); if(rst==-1)printf("Impossible"); else printf("%lld",rst); return 0; }
相关文章推荐
- pat甲级1010. Radix (25)
- pat甲级1010. Radix (25)
- PAT 甲级 1010. Radix (25)
- PAT甲级1010
- 1010. Radix (25)-PAT甲级真题(二分法)
- PAT甲级1010【Radix】二分搜索java题解
- **浙大PAT甲级 1010 进制转化
- [PAT-甲级]1010.Radix
- PAT 甲级练习 1010
- PAT甲级 1010.Radix(25) 题目翻译与答案
- PAT 甲级 1010.Radix (25)
- PAT甲级1010
- pat 甲级 1010. Radix (25)
- PAT甲级1010:Radix
- 【PAT】甲级1010 - Radix(二分 & 有坑)
- pat 甲级 1010
- 浙大pat | 浙大pat 牛客网甲级 1010 Build A Binary Search Tree (30) 二叉搜索树
- PAT(甲级)1010
- PAT甲级1010
- PAT(甲级)1010. Radix (25)