您的位置:首页 > 其它

1010. Radix (25)

2016-06-27 11:03 423 查看

1010. Radix (25)

目录

Radix 25
目录

原题

思路

AC代码

原题

1010. Radix (25)链接

思路

1. 以字符串形式读入读入前两个数字。以整型的形式读入后两个数字。
2.  如果第三个数字是1,使用strtol函数把第一个数字转换为十进制数。从i=1循环,直到36为止。
1.  使用strtol函数把第二个数字以转换为i进制数。
2.  如果两者相等,输出i。如果第二个数字大于第一个数字,输出Impossible,跳出循环。
3.  对于第三个数字是2,有类似的处理方式。


但是这种思路有错误。

第一:radix最大可达INT_MAX。

第二:已知进制的数字不会大于int的上限,但是要求的数字不仅会超过int的上限,而且也会超过long long的上限。

第三:这种暴力求解的方法会超时。

AC代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <climits>

long long find_max_digit(char string[]);
long long strtolong(char string[], int radix);
int compare(char string[], int radix, long long num1);

int main(void) {
char string1[11], string2[11], string3[11];
int tag, radix;
long long start, end;
scanf("%s %s %d %d", string1, string2, &tag, &radix);
if (2 == tag) {
strcpy(string3, string1);
strcpy(string1, string2);
strcpy(string2, string3);
}
long long num1 = strtolong(string1, radix);
long long least_possible_radix;
least_possible_radix = find_max_digit(string2);

start = least_possible_radix;
end = num1 > start + 1 ? num1 : start + 1;
while (start <= end) {
long long middle = (start + end) >> 1;
int result = compare(string2, middle, num1);
if (result > 0) {
end = middle - 1;
}
else if (!result) {
printf("%lld\n", middle);
return 0;
}
else {
start = middle + 1;
}
}
puts("Impossible");
return 0;
}

long long find_max_digit(char string[]) {
int length = strlen(string);
int max_digit = 0;
for (int i = 0; i < length; i++) {
if (isalpha(string[i])) {
max_digit = max_digit < string[i] - 'a' + 10 ? string[i] - 'a' + 11 : max_digit;
}
else {
max_digit = max_digit < string[i] - '0' + 1 ? string[i] - '0' + 1 : max_digit;
}
}
return (long long)max_digit;
}

long long strtolong(char string[], int radix) {
long long sum = 0ll, temp;
int length = strlen(string);
for (int i = 0; i < length; i++) {
temp = isdigit(string[i]) ? string[i] - '0' : string[i] - 'a' + 10;
sum = sum * radix + temp;
}
return sum;
}

int compare(char string[], int radix, long long num1) {
long long sum = 0ll, temp, base = 1ll;
int length = strlen(string);
for (int i = length - 1; i >= 0; i--) {
temp = isdigit(string[i]) ? string[i] - '0' : string[i] - 'a' + 10;
sum += temp * base;
base *= radix;
if (sum > num1) {
return 1;
}
}
if (sum == num1) {
return 0;
}
else {
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: