题目链接:点击打开链接
现在定义一种编码规则:对于长度为3的字符串(均由小写字母组成),首先按照字典序进行排序,即aaa,aab,aac,…,zzz,
将这些字符串按照顺序依次从00001至17575编码(前缀0不可省略),即aaa=00000,aab=00001,aac=00002,…,zzz=17575。
现在给出一串数字,请你通过计算输出这串数字对应的原字符串。(输入保证该数字长度为5的倍数)
例如输入000021757511222,每五位编号对应于一个字符串
编号00002对应字符串 aac
编号17575对应字符串 zzz
编号11222对应字符串 qpq
故输出为 aaczzzqpq
输入描述:
输入第一行包含一个整数T,代表测试案例个数。(0 < T ≤10)
接下来每个测试案例包括两行,第一行为一个整数length(0<length<=100),代表数字串的长度,第二行为长度为length的数字串。
输出描述:
输出数字串对应的原字符串。
示例1
输入
2
10
0000000001
15
000021757511222
输出
aaaaab
aaczzzqpq
我的代码:
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
string a[17576];
int ans[100];
void pass_list(){ //把"aaa"~"zzz"先打个表。
string b="aaa";
for(int i=0;i<=17575;i++){
a[i]=b;
b[2]+=1;
{
if(b[2]==('z'+1)){
b[2]='a';
b[1]+=1;
{
if(b[1]==('z'+1)){
b[1]='a';
b[0]+=1;
}
}
}
}
}
}
int main(){
pass_list();
int t,n,m,i,j;
cin>>t;
string c;
while(t--){
cin>>n; cin>>c;
j=0;
int flag,wei;
memset(ans,0,sizeof(ans));
for(i=0;i<n/5;i++){
flag=0;wei=10000;
while(j<n){
ans[i]+=(c[j]-'0')*wei; //字符串每隔5位截取为一个数字
wei/=10;
j++;flag++;
if(flag==5)
break;
}
}
for(int i=0;i<n/5;i++){
cout<<a[ans[i]]; //对应数字的表直接输出就行了
}
cout<<endl;
}
return 0;
}
看看这题AC排行榜第一的代码:
#include <stdio.h>
int main()
{
int t, ans, n;
char str[110], s[4];
scanf("%d", &t);
while (t--)
{
scanf("%d%s", &n, str);
for (int i = 0; i < n; i += 5)
{
ans = 0;
for (int j = 0; j < 5; j++)
ans = ans * 10 + str[i + j] - '0';
s[0] = 'a' + ans / 676;
s[1] = 'a' + ans % 676 / 26;
s[2] = 'a' + ans % 676 % 26;
printf("%s", s);
}
printf("\n");
}
return 0;
}
怎么人家就那么聪明那!!!!QAQ