B. 神秘信息
单点时限: 2.0 sec
内存限制: 256 MB
未来的某一天,人类登陆火星。在火星上发现一组由各种符号表示的神秘信息。研究发现:每种符号表示一个数码,神秘信息是一个整数。但是不知道每个符号表示的是哪个数码,也不知道它是几进制数 (只知道不可能是一进制),但知道相同的符号表示相同的数码,不同的符号表示不同的数码。
符号总计有 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。
输入格式
第 1 行:整数 T (1≤T≤10) 为问题数。
第 2 行:第一个问题的数据。一个字符串表示的神秘信息,长度范围为 [1,60]。
第 3 ∽ T+1 行:后面问题的数据,格式与第一个问题相同。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后在一行中输出神秘信息表示的最小整数值(输入数据保证输出的整数不超过 1018)。
样例
input
3 11001001 cats zigoutput
case #0: 201 case #1: 75 case #2: 11
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int t = 0;
int h = 0;
char ch = 0, arr[61];
scanf_s("%d", &t);
for (;t > 0; t--)
{
scanf("%s", arr);
int turn[128] = { 0 };
int i = 0, fundem = 0;
char* p = arr;
int count = 1;//放置在区块内部,使其每一次循环时都进行一次初始化
long long ret = 0;
for (int j = 0; j < 128; j++)//较大难点,用ASCII码记录
{
turn[j] = -1;
}
turn [*p] = 1;//*p即是键盘录入字符串的ASCII,也就是说turn会用下标记录特殊值,
// 其余均为-1
while (*++p)
{
if (turn[*p] == -1)
{
turn[*p] = fundem;
if (fundem == 0)
{
fundem = 2;
}
else
{
fundem++;
}
count++;
}
}
if (count < 2)
{
count = 2;
}
p = arr;
while (*p)
{
ret = ret * count + turn[*(p++)];
}
printf("case #%d:\n",h );
printf("%lld\n", ret);
h++;
}
return 0;
}
F. 平衡三进制
单点时限: 2.0 sec
内存限制: 256 MB
平衡三进制分别使用字符 ‘-‘, ‘0’, ‘1’ 表示 -1, 0, 1。下表表示从 0 到 10 的十进制数对应的平衡三进制的值。
例如 7=1×32+(−1)×31+1×30=9–3+1=7。
现在给你一个关于平衡三进制的串,请将其转成对应的十进制数。
输入格式
第 1 行:整数 T (1≤T≤10) 为测试数据组数。
第 2 ~ T+1 行:每个问题一行,每行输入一个平衡三进制的字符串,保证其转换成的十进制整数小于109,且全为非负整数。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后输出对应问题的结果。
样例
input
3 1--- 1000 1-0-1-1-1-1output
case #0: 14 case #1: 27 case #2: 37726
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int t = 0 ;
char arr[100] = { 0 };
scanf("%d", &t);
for (int k = 0; k < 100; k++)
{
arr[k] = 0;
}
for (int i = 0;i < t;i++)
{
scanf("%s", &arr);
char* p = arr;
long sum = 0;
int j = 0;
for (;j < strlen(arr); j++)
{
sum = sum * 3;
if (arr[j] == '1')
{
sum += 1;
}
else if (arr[j] == '0')
{
;
}
else if (arr[j] == '-')
{
sum -= 1;
} }
printf("case #%d:\n",i);
printf("%ld\n", sum);
}
return 0;
}