您的位置:首页 > 其它

【PAT甲级】1010. Radix (25)

2016-09-29 18:48 429 查看
注:在进行十进制转换时,每一步都应当判断溢出。

注2:radix可能非常大,需要运用二分查找。

#include <stdio.h>
#include <string.h>
#include <cmath>

long long getDecimal(char a[], int radix);
int getDigit(char c);
int findRadix(char N[], long long low, long long high);
int findMax(char N[]);
long long getMax(long long a, long long b, long long c);
char N1[11], N2[11];
long long num1, num2, radix;
int tag;

int main(int argc, char *argv[]) {
scanf("%s %s %d %lld", N1, N2, &tag, &radix);
if (tag == 2) {
for (int i = 0; i < 11; i++) {
char tmp = N1[i];
N1[i] = N2[i];
N2[i] = tmp;
}
}
num1 = getDecimal(N1, radix);
long long low = findMax(N2) + 1;
long long high = getMax(num1 + 1, radix, low);
int out = findRadix(N2, low, high);
if (out == -1)
printf("Impossible\n");

return 0;
}

long long getDecimal(char a[], int radix) {
long long num = 0;
int n;
int d = strlen(a);
for (int i = 0; i < d; i++) {
n = getDigit(a[i]);
num += n * pow(radix, d - 1 - i);
if (num < 0)
return -1;//判断溢出,这一步很重要
}
return num;
}
int getDigit(char c) {
if (c <= 57)
return int(c - '0');
else {
return int(c - '0' - 39);
}
}
int findRadix(char N[], long long low, long long high) {
if (low > high)
return -1;
long long mid = (low + high) / 2;
long long n = getDecimal(N, mid);
if (n == num1) {
printf("%lld\n", mid);
return 1;
} else if (n == - 1 || n > num1) {
return findRadix(N, low, mid - 1);
} else {
return findRadix(N, mid + 1, high);
}
}
int findMax(char N[]) {
int d = strlen(N);
int n;
int max = 0;
for (int i = 0; i < d; i++) {
n = getDigit(N[i]);
if (max < n)
max = n;
}
return max;
}
long long getMax(long long a, long long b, long long c) {
long long m = a;
if (b > m) m = b;
if (c > m) m = c;
return m;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: