题目描述
小明获得了一些密码的片段,包含0∼9,A∼F 这些字符,他猜这些是某个进制下的一个整数的数码串。 小明想知道从2到16进制中,哪些进制下,这个数码串的对应的十进制整数值,等于n?
输入
存在不超过1000个样例,每行一个样例。 每行包括两部分,数码串(串长不超过31),整数n(1≤n≤109)
输出
每行输出一个样例的结果。 如果存在多个解,输出最小的那个进制。 如果没有满足的进制,输出"Impossible"。
样例输入
F 15 F 14 23 11 25 13
样例输出
16 Impossible 4 Impossible
又是一次样例都过,结果WA的测试题,最后发现是第25行sum=0的问题
AC代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
char str[110];
__int64 n;
while (scanf("%s %I64d", str, &n) != EOF) {
int arr[1010] = {0};
int len = strlen(str);
int max = 0;
for (int i = 0; i < len; i++) {//将字符串转化成数值
if (str[i] >= 'A' && str[i] <= 'F') {
arr[i] = str[i] - 'A' + 10;
}
if (str[i] >= '0' && str[i] <= '9') {
arr[i] = str[i] - '0';
}
}
__int64 sum, temp;
__int64 flag = 0;
for (__int64 i = max + 1; i <= 16; i++) {
sum = 0;
for (__int64 j = 0; j < len; j++) {
if (arr[j] >= i) break; //如果arr[]中的值大于进制数,则不存在该转换
sum = sum * i + arr[j];
}
if (sum == n) {
flag = 1;
temp = i;
break;
}
}
if (flag == 1) printf("%I64d\n", temp);
else printf("Impossible\n");
}
return 0;
}
测试时的代码:(WA)
#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
char str[110];
__int64 n;
while (scanf("%s %I64d", str, &n) != EOF) {
int arr[1010] = {0};
int len = strlen(str);
int max = 0;
for (int i = 0; i < len; i++) {
if (str[i] >= 'A' && str[i] <= 'F') {
arr[i] = str[i] - 'A' + 10;
}
if (str[i] >= '0' && str[i] <= '9') {
arr[i] = str[i] - '0';
}
}
__int64 sum, temp;
__int64 flag = 0;
for (__int64 i = max + 1; i <= 16; i++) {
sum=arr[0];
for (__int64 j = 1; j < len; j++) {
if (arr[j] >= i) break;//测试时这样写没把arr[0]与进制数进行比较,考虑不全面;
sum = sum * i + arr[j];
}
if (sum == n) {
flag = 1;
temp = i;
break;
}
}
if (flag == 1) printf("%I64d\n", temp);
else printf("Impossible\n");
}
return 0;
}