【问题描述】密文传送(encode.cpp/c/pas)
黑暗军团的情报采用密文传输,即把一些有规律的单词编成数字。其原理是:字母表中共有26个小写字母{a,b,…,z},这些特殊的单词长度不超过20且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。例如:a→1, b→2, z→26, ab→27, ac→28。
你的任务就是对于所给的单词,求出它的编码。
【输入格式】
仅一行,被编码的单词。
【输出格式】
仅一行,对应的编码。如果单词不在字母表中,输出0。
【输入样例】
ab
【输出样例】
27
#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int c(int m,int n)
{
if(n==0)
return 1;
int s=1;
int p=2;
for(int k=m; k>=m-n+1; k--)
{
s*=k;
if(s%p==0 && p<=n)
{
s/=p;
p++;
}
}
return s;
}
int main()
{
char s[100];
int num[100];
ll sum;
while(~scanf("%s",s))
{
num[0]=0;
sum=0ll;
int len=strlen(s);
for(int i=0; i<len; i++)
{
num[i+1]=s[i]-'a'+1;
}
if(len>1)
{
for(int i=1; i<len; i++)
{
for(int j=num[i-1]+1; j<num[i]; j++)
{
sum+=c(26-j,len-i);
}
}
sum+=num[len]-num[len-1];
}
else
sum+=num[1];
printf("%lld\n",sum);
}
return 0;
}