未来的某一天,人类登陆火星。在火星上发现一组由各种符号表示的神秘信息。研究发现:每种符号表示一个数码,神秘信息是一个整数。但是不知道每个符号表示的是哪个数码,也不知道它是几进制数 (只知道不可能是一进制),但知道相同的符号表示相同的数码,不同的符号表示不同的数码。
符号总计有 62 种,为方便起见,每种符号分别用大小写英文字母和数字 0-9 表示。
现在我们想要知道神秘信息表示的最小整数值。
例如 :
11001001 最小整数值和人类的二进制数一样,为 201;
cats 最小整数值为 75(设是 4 进制数,c 表示 1,a 表示 0,t 表示 2,s 表示 3);
pig 最小整数值为 11(设是 3 进制数,p 表示 1,i 表示 0,g 表示 2)。
注意:神秘信息表示的数必须是有意义的,第一位不能为 0。
Input
第 1 行:整数 T (1≤T≤10) 为问题数。
第 2 行:第一个问题的数据。一个字符串表示的神秘信息,长度范围为 [1,60]。
第 3 ∽ T+1 行:后面问题的数据,格式与第一个问题相同。
Output
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后在一行中输出神秘信息表示的最小整数值(输入数据保证输出的整数不超过 1018)。
思路:最小的数字为102345….N-1
#include <stdio.h> int main(void) { char s[61]; scanf("%s", s); int a[128]; for (int i = 0; i < 128; i++) a[i] = -1; //初始值为-1,表示未出现 int digit = 0, N = 1; //N进制 char *p = s; a[*p] = 1; while (*++p){ if (a[*p] == -1){ //如果未出现 a[*p] = digit; digit = digit ? digit + 1 : 2; //若digit为0则下一位是2,否则是digit + 1 N++; } if (N < 2) N =2; long long ans = 0; p = s; while (*p) ans = ans * N + a[*p++]; printf("%I64d\n", ans); } }