C语言实现 字典序问题

您所在的位置:网站首页 c语言字典排序算法 C语言实现 字典序问题

C语言实现 字典序问题

2024-07-11 23:22| 来源: 网络整理| 查看: 265

字典序问题 在数据加密和数据压缩中常需要对特殊的字符串进行编码。 给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。 例如,a,b,ab,bc,xyz等字符串都是升序字符串。 现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。

12…262728…ab…zabac…

数据输入: 输入数据油文件名为input.txt的文本文件提供。文件的第1行 是一个正整数k,表示接下来有k行。在接下来的k行中,每行给出一个字符串。 结果输出: 将计算结果输出到文件output.txt。文件有k行,每行对应一个字符串的编码。

输入文件示例 输出文件示例 input.txt output.txt 2 1 a 2 b

https://blog.csdn.net/kavu1/article/details/52456135 这是一个博主写的思路分析,我认为他写的思考过程十分清晰,但代码的注释不是很详细,有点难懂,可以作为参照。

思路: 我们可以先来手动模拟一下这个过程,以cfg为例

首先我们要把一位,两位的升序字符串数目计算出来,从a-z,ab、ac再到bc、bd,最后到yz。 这一部分和求组合数的过程十分相似,只需求出所有组合情况,由于组合的成员是不能重复的,每种组合总会存在一种符合升序的序列,二者在数目上是相等的。 sum+=C(1,26)+C(2,26)

再到位数和输入字符串相同,但在其之前的部分,如在cfg之前的abc,cef等。 我们需要依次计算出a开头的序列,b开头的序列,还要考虑到第二位的情况。 以a为例,后边两位即是从b开始的两位字母组合,a不会再次出现;首位为b时,后边两位就要从c开始,a、b都不会再次出现。 sum+=C(2,25)+C(2,24) 而后是从cde开始,一直到我们要求的cfg的过程。 cd和cf之间还有cd、ce 首先是cd开头的,有C(1,22),ce开头的,有C(1,21) 最后是cf开头的,只有一个cfg可选。 sum+=C(1,22)+C(1,21)

#include #include int combine(int m,int n){//计算组合数的函数 double sum1=1;//正常情况下,int数据类型不足以存储阶乘的位数,所以采用长整型存储中间过程 double sum2=1;//待除法运算过后,数的阶降低很多,再强制转换为int类型 if(m>n){ return 0; } else{ for(int i=1;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3