1010. Radix (25)
2017-02-15 11:09
246 查看
题目大意 :给两个数N1,N2,告诉其中一个数字的进制为radix,计算N2在什么进制下 N2 == N1,没有输出”Impossible“。
思路:
N2进制的取值是有范围的,下限是N2每一位数字之中的最大值+1 (例如1234 最小肯定是5进制,b 最小肯定是12进制,上限是N1 +1 。题目中很容易让人想到最大进制是36,但其实不是。radix取值可以非常大所以用long long类型是合理的,例如(* 111 10101 1 100 *)。
因为radix可以非常大,直接从最小进制顺序搜索会有一个case超时 ,所以要采用二分搜索。
#include<stdio.h> #include<stdlib.h> #include<string.h> long long ToDec(char num[], long long radix)//转化成10进制 { long long sum, temp; sum = 0; temp = 1; for (long long i = strlen(num) - 1; i >= 0; i--) { if (num[i] >= '0' && num[i] <= '9') sum += (num[i] - '0')*(temp); else if(num[i] >= 'a' && num[i] <= 'z') sum += (num[i] - 'a' + 10)*(temp); temp *= radix; } if (sum < 0)//转化的数字已经超过long long了,肯定大于N1这里写图片描述 return -1; return sum; } int minradix(char N[])//最小的进制 { int j = 0; int temp; for (int i = 0; i < strlen(N) ; i++) { if (N[i] >= '0' && N[i] <= '9') temp = N[i] - '0'; else if (N[i] >= 'a' && N[i] <= 'z') temp = N[i] - 'a' + 10; if (temp > j) j = temp; } return j + 1;//最大的数字 +1 这是最小的进制 } long long BinSearch(long long high, long long low, long long target, char N[]) { long long res = -1, min, tempNum; while (low <= high) { min = (low + high) / 2; tempNum = ToDec(N, min); if (tempNum == target) { res = min; break; } else if (tempNum == -1 ||tempNum > target) { high = min - 1; } else if (tempNum < target) { low = min + 1; } } return res; } int main() { int tag; long long radix; char N1[11], N2[11], temp[11]; scanf("%s%s%d%lld", N1, N2, &tag, &radix); //printf("%s %s %d %d", N1, N2, tag, radix); long long target; long long res, minRadix, maxRadix; if (2 == tag) { strcpy(temp, N1); strcpy(N1, N2); strcpy(N2, temp); } target = ToDec(N1, radix);//目标十进制 minRadix = minradix(N2); maxRadix = target + 1; res = BinSearch(maxRadix, minRadix, target, N2); //int flag = 0; //直接搜索会有一个case超时 //long long i; //for (i = minRadix; i <= maxRadix; i++) { // if (ToDec(N2, i) == target) { // flag = 1; // break; // } //} if (-1 == res) printf("Impossible"); else printf("%lld", res); system("pause"); return 0; }
相关文章推荐
- 1010. Radix (25)
- PAT_A 1010. Radix (25)
- 1010. Radix (25)
- PAT 1010. Radix(25)
- 1010. Radix (25)
- PAT甲级1010. Radix (25)
- PAT甲级1010 . Radix (25)
- 1010. Radix (25)
- 【再思考】1010. Radix (25)
- 1010. Radix (25)
- 1010. Radix (25)
- PAT甲题题解-1010. Radix (25)-二分搜索
- 1010. Radix (25)
- PAT 1010. Radix (25)
- 1010. Radix (25)
- 1010. Radix (25)
- PAT-A 1010. Radix (25)
- pat甲级1010. Radix (25)
- 【c++】PAT (Advanced Level)1010. Radix (25)
- 1010. Radix (25)(PAT甲)