首页 > 编程知识 正文

c语言怎么按姓名排序,c语言实现字典数据结构

时间:2023-05-03 11:33:12 阅读:170434 作者:1431

词典顺序问题

在数据加密和数据压缩中,经常需要对特殊的字符串进行编码。

给定的字母a由26个小写字母构成。 在由字母生成的升序字符串中,每个字符最多出现一次,顺序与字母在字母中的出现顺序相同。

例如,所有字符串(如a,b,ab,bc,xyz)都是升序字符串。

对于所有按字母顺序生成的长度小于或等于6的升序字符串,现在计算字典编码。

12…262728…ab…zabac…http://www.Sina.com /输入数据文件名称以input.txt文本文件提供。 文件的第一行

是正整数k,表示有k行。 以下k行为每行提供一个字符串。

数据输入:将计算结果输出到文件output.txt。 该文件包含k行,每行对应一个字符串的编码。

输入文件示例输出文件示例input.txt output.txt 21a 2b https://blog.csdn.net/kavu1/article/details/52456135

这是一个博主写的思路分析,我觉得他写的思考过程非常清晰,但代码评论不是很详细,有点难懂,请看。

想法:

首先,我们以cfg为例,手动模拟这个过程

首先,计算1位、2位升序字符串的数量。 从a-z、ab、ac到bc、bd,最后到yz。

这一部分与求组合数的过程非常相似。 只要求所有组合的情况。 因为组合的成员不能重复,所以每个组合中一定存在升序匹配的序列,两者在数量上是相等的。

结果输出:

而且位数与输入字符串相同,但其前面的部分,例如cfg前面的abc、cef等。

依次计算从a开始的序列、从b开始的序列,也需要考虑第2位的情况。

以a为例,下面的2位是从b开始的2位字符的组合,a不会再次出现; 如果第一名是b,接下来的两个人必须从c开始,a、b都不会再次出现。

sum+=C(1,26)+C(2,26)

然后是从cde开始,到我们追求的cfg的过程。

cd和cf之间还有cd、ce

首先从cd开始,从C (1,22 )、ce开始,然后是C ) ) 1,21 )

最后以cf开始。 只能选择一个cfg。

sum+=C(2,25)+C(2,24)

# include stdio.h # include string.hint combine (intm,int n )//计算组合数的函数double sum1=1; //通常,int数据类型不足以容纳阶乘的位数,所以使用long类型存储中间进程double sum2=1; //除法后,数的步骤下降很多,强制变换为int型if(Mn ) { return 0; (else ) for ) intI=1; i=n-m; I ) (/计算(n-m )! sum1*=i; }for(intI=m1; i=n; I ) (/计算n! /m! sum2*=i; } } return sum2/sum1; (//计算升序字符串代码,即输入字符串前的升序字符串序列的个数。 算法与组合数相同。 也就是说,必须取所有的可能性,但由于是升序,所以不需要排列,从多个可能性中仅通过一种升序序列intcount(charstr ),int low ) /计算就成为与输入字符串相同的位数,但该字符串之前的升序字符串int low char high=str[0]; for(intI=low1; i=high-'a '; I ) ) {//low用于存储高位到达的字母位置,如果对下一位的运算方便,则从该高位的第二开始计算sum=combine (len-1,26-I ); (if ) len1) ) sum=count ) str[1],high-'a' 1); //递归运算,将下一位作为最高位进行穿,进行后面位置的计算} return sum; }int main () Freopen ) ) input.txt )、) r )、stdin ); freopen(output.txt )、) w )、stdout ); int n; scanf('%d ',n ); while(n----) { int sum=1; char str[10]; scanf('%s”,str ); for(intI=1; I=strlen(str )-1; I ) ) sum=combine(I,26 ); //计算小于或等于输入字符串位数的所有可数组性(sum=count(str,0 ); printf(%d(n ),sum ); } return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。