小傻题——笨蛋的看题日记:)——>2

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
zig

output

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-1

output

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值