C. 神秘信息
单点时限: 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 行:整数 () 为问题数。
第 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<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
int T;
cin>>T;
for(int cas=0;cas<T;cas++)
{
string str;
map<char,int> a;
int R=0;
cin>>str;
int len=str.length();
a.clear();//删除所有元素
a[str[0]]=1;
for(int j=0;j<len;j++)
{
if(a.find(str[j])==a.end())
{
a[str[j]]=R;
R=R?R+1:2;//******
}
}
if(R<2) R=2;
long long N=0;
for(int j=0;j<len;j++)
{
N*=R;
N+=a[str[j]];
}
cout<<"case #"<<cas<<":"<<endl<<N<<endl;
}
return 0;
}
题目理解错误
输入:777 -> 输出:7 (数字只是字符,并不具备本身的值)
①、c语言可以用字符数组代替map:字符的ACSII码为下标,其中存储的元素为值
②、c中字符数组与c++中string区别:
char a[100];
string s;
string // 这个头文件是C++的标准库中的string类型的头文件
string.h//这个头文件是c标准库中的字符串函数声明头文件。 在C++中一般用 cstring 头文件来代替。
获取长度:len = strlen(a);
len = s.length();
len = strlen(s.c_str());
③、map定义好后,mapname.clear() -> 清空元素,长度为0