火星人是以 13 进制计数的:
地球人的 0 被火星人称为 tret。
地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。
例如地球人的数字 29 翻译成火星文就是 hel mar;而火星文 elo nov 对应地球数字 115。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入格式:
输入第一行给出一个正整数 N(<100),随后 N 行,每行给出一个 [0, 169) 区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
#include<iostream>
#include<map>
#include<string>
using namespace std;
string down[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"};//低位
string up[13]={"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"};//高位
map<string,int>mp;
void fnum(string c)
{
int len=c.size();
int w=1,num=0;
for(int i=len-1;i>=0;i--)
{
num+=(c[i]-'0')*w;//注意这里的c[i]-'0',而不是直接c[i]
w*=10;
}
int a=0,b=0;
a=num/13;
b=num%13;
if(a==0)//如果是单个位数,即全低位,0~12,只输出低位
cout<<down[b]<<endl;
else if(b==0)//如果是13的倍数,即13,26,39...只输出高位
cout<<up[a]<<endl;
else
cout<<up[a]<<" "<<down[b]<<endl;
}
int main()
{
for(int i=0;i<13;i++)
{
mp[down[i]]=i;
}
for(int i=13;i<169;i++)
{
int a=i/13,b=i%13;
string s;
s+=up[a];
if(b==0)
{
mp[s]=i;
continue;
}
s=s+' '+down[b];
mp[s]=i;
}
int n;
cin>>n;
getchar();
for(int i=0;i<n;i++)
{
string a;
getline(cin, a);
if(a[0]>='0'&&a[0]<='9')
fnum(a);
else
cout<<mp[a]<<endl;
}
return 0;
}
错误之处,13的倍数的时候,总应该输出高位,即13的倍数所代表的数值
Sample Input:
5 3
0 0 255 16777215 24
24 24 0 0 24
24 0 24 24 24
Sample Output:
24
巧妙运用了map的优点:任意的访问能力,访问任何一个元素类型的任意性质。并且第一元素和第二元素都可以查询和遍历
#include<cstdio>
#include<map>
using namespace std;
map<int,int>mp;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
int a;
scanf("%d",&a);
if(mp.find(a)==mp.end())
mp[a]=0;
mp[a]++;
}
int x=n*m/2,max=0,key;
for(map<int,int>::iterator i=mp.begin();i!=mp.end();i++)
if(i->second>x&&i->second>max)
{
key=i->first;
max=i->second;
}
printf("%d\n",key);
return 0;
}