ECNU OJ 3053 神秘信息

未来的某一天,人类登陆火星。在火星上发现一组由各种符号表示的神秘信息。研究发现:每种符号表示一个数码,神秘信息是一个整数。但是不知道每个符号表示的是哪个数码,也不知道它是几进制数 (只知道不可能是一进制),但知道相同的符号表示相同的数码,不同的符号表示不同的数码。

符号总计有 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 (1T10) 为问题数。

第 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);
    }
}

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注