求一“字典序问题”的c语言程序

来源:百度知道 编辑:UC知道 时间:2024/06/29 22:20:46
描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A 由26 个小写英文字母组成A={a,b,…,z}。该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1 次。例如,a,b,ab,bc,xyz 等字符串都是升序字符串。现在对字母表A 产生的所有长度不超过6 的升序字符串按照字典序排列并编码如下。
1 2 … 26 27 28 … 对应 a b … z ab ac …
对于任意长度不超过6 的升序字符串,迅速计算出它在上述字典中的编码。
编程任务:
对于给定的长度不超过6 的升序字符串,编程计算出它在上述字典中的编码。

Input

输入数据第一行给出一个字符串。

Output

程序运行结束时,将计算结果输出字符串的编码。

Sample Input

a

Sample Output

1

哇哈哈~
感觉和POJ1850 CODE一模一样,做过。排列组合问题
对于r组合a1,a2,a3,...,ar(其中a1<a2<a3<...<ar)来说,它在S的所有r组合中的编号为
C(r, n)-C(r,n-a1)-C(r-1,n-a2)-...-C(1,n-ar)

可惜分太少了,一般百度知道上这种问题应该都悬赏50以上才有人答,碰到我算你幸运

#include <iostream>

using namespace std;
__int64 cnk(__int64 n, __int64 k)
{
int i;
if(k == 0) return 1;
if(k == 1) return n;
__int64 r = n;
for(i = 2; i <= k; i++)
r = r*(n-i+1)/i;
return r;
}
int main()
{
char s[12];
__int64 i, l, ans;
while(scanf("%s", s) != EOF)
{
ans = 0;
l = strlen(s);
bool flag = true;
if(s[0] >= 'a' && s[0] <= 'z')
{
for(i = 1; i < l; i++)
{
if(s[i-1] < s[i] && 'a'<=s[i]&&s[i]<='z')
contin