C语言一道题,总有专家会觉得挺简单的吧
发布网友
发布时间:2023-02-12 08:04
我来回答
共2个回答
热心网友
时间:2023-07-19 20:35
代码供参考,没考虑无法编码的情况,你自己加一些检查语句即可。
#include<stdio.h>
#include<string.h>
#include <iostream>
#include <math.h>
using namespace std;
long long t[10][26]= {0}; //查表,将最简形式的编码事先准备好
/*
行号: 0 1 2 3 4 ... 24 25
列号:0 a b c d e ... y z
1 ab bc cd de ef ... yz zz
2 abc bcd cde efg ghi ... xyz zzz
3
4
...
9 abcdefghij .....qrstuvwxyz ...zzzzz
*/
void init_table()
{
int i,j;
for(i=0;i<26;i++)
{
t[0][i]=i+1; //对应的是 a/b/c/.../z的编码是1-26;
}
for(i=1;i<10;i++)
{
t[i][0]=t[i-1][25]+1; //abc 总是等于上一行(降阶) yz +1
for(j=1;j<26-i;j++)
{
t[i][j] = t[i][j-1] + 1 + t[i-1][25] - t[i-1][j];
//cde - bcd = byz + 1 - bcd = 1 + yz - cd
}
for(j=26-i;j<26;j++)
{
t[i][j]=t[i][j-1]; //因为z2、y3这些不合法,所以无增加编码,都是和前面的最简式子一样的数
}
}
return;
}
long long lookup(char *sNum)
{
/*
举例:
bdfxz = b4 - c3 + d3 - e2 + f2 - g1 +x1 - y0 +z0
*/
long long ret =0;
int i,j;
char *p = sNum;
int n = strlen(p);
while(n>1)
{
i = n-1;
j = *p - 'a';
ret = (t[i][j] - t[i-1][j+1]) + ret;
n--;
p++;
}
ret += t[0][*p-'a'];
return ret;
}
int main(void)
{
int i,j,k;
char s1[80]="vwxyz";
init_table();
int n;
cin>>n;
while(n>0)
{
cin>>s1;
cout<<lookup(s1)<<endl;
n--;
}
return 0;
}
热心网友
时间:2023-07-19 20:36
ab为什么会是27呢? 没说清楚