一个c++ 程序看不懂 请高手指教!!!

//字母序问题
//在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表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 的升序字符串,迅速计算出它在上述字典中的编码。
第一行是一个正整数k,表示接下来共有k行。接下来的k行中,每行给出一个字符串。
输出共有k行,每行对应于一个字符串的编码。
Sample Input
2
a
b

Sample Output
12

#include<iostream>
using namespace std;
int C(int r,int n)
{
int answer=1;
int a=1,b=1;
if(r!=0)
{
for(int i=n;i>n-r;i--)
{
a=a*i;
}
for(int j=2;j<=r;j++)
b=b*j;
answer=a/b;
}
return answer;
}
int main ()
{
int i,j;
char ch[10];
int ch1[10];
cin>>ch;
int n=strlen(ch);
int sum=1;
int start=1;
for(i=1;i<n;i++)
sum+=C(i,26);
for(i=0;i<n;i++)
ch1[i]=ch[i]-96;
for(i=n;i>=1;i--)
{
for(j=start;j<ch1[n-i];j++)
{
sum+=C(i-1,26-j);
}
start=ch1[n-i]+1;
}
cout<<sum<<endl;
system("pause");
return 0;
}
这是在百度上查的程序,但是,最主要的是看不懂
求讲解!!!
急!!! 谢谢了!!!!!!

#include<iostream>
using namespace std;
int C(int r,int n)
{
int answer=1;
int a=1,b=1;
if(r!=0)
{
for(int i=n;i>n-r;i--)
{
a=a*i;
}
for(int j=2;j<=r;j++)
b=b*j;
answer=a/b;
}
return answer;
}//这个函数以及组合的详细见下面的解释A。
int main ()
{
int i,j;
char ch[10];
int ch1[10];
cin>>ch;//输出当前字符串Ch
int n=strlen(ch);//判断字符串长度
int sum=1;
int start=1;

for(i=1;i<n;i++)//计算 当前位数为N的字符串Ch的 前(n-1),(n-2)```1,个字符串组合的总数
sum+=C(i,26);

for(i=0;i<n;i++)//将输入!字符串!的每一位转化为数字以确定字符串中每一位 !字符! 在a,b,c...z中的第几位以及该!字符!之前有几个!字符!(注意字符和字符串)
ch1[i]=ch[i]-96;

for(i=n;i>=1;i--)//确定Ch的位数后,对每一位进行排列组合的分析,假设 Ch = “bdfr”,则先判断第一位b之前的四位字符串总和 ,下面解释都是以第一次循环做解释
{
for(j=start;j<ch1[n-i];j++)//计算第一位“b”之前的四位字符串总和,ch1[n-i](i此时为n)此时表示第四位字符“b”在字母表中的排位,第2,即j<2 ;
{
sum+=C(i-1,26-j);//排列组合 见解释B
}
start=ch1[n-i]+1;//计算第一位“b”之前的四位字符串总和之后,开始计算第二位“d”之前的四位字符串总和,此时第一位已经固定 ,第二位应该从(第一位+1)的字符开始考虑····所以start=ch1[n-i]+1
}
cout<<sum<<endl;
system("pause");
return 0;
}

解释A。题目的意思,假设我输出的是四位字符串,那么就是相当于从26个字母中选择4个插入四个并列空格子1 -2 -3 -4 ,因为这字符顺序是固定的,所以我只需求出26个字母中每4个不同的字母一共有多少种组合方式即为这个四位字符串总共有多少个,以此类推,当我输出的是N位字符串,那么我从M个任意取出N个不同的组合,公式C = M! / [ (M -N )! * N! ]

解释B。计算第一位“b”之前的四位字符串总和,第一位为b,那么b之前只有a,即求所有a为第一位的四位字符串,因为首位a固定,后面即是从25个字母中取出3个进行组合,C = 25!(22!*3!);

解释的很详细了 不懂追问,组合不明白的话建议看下概念,还有,之前的程序没问题,楼上说的aa 。ba,cb什么的都是不符合题意要求的字符串。程序中的C()函数已经排除了这些不合要求的字符串,所以只要输入的字符串符合要求,得出的结果一定是正确的
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-24
这是一个字符串转数字编码的程序。
也就是可以看成是26进制对应于10进制的转换。只不过是采用了分位计算的方式。
把数的长度和当前数的位置当成参数,就可以计算出对应位的数值了。

代码排版有点乱。
调整如下:
//计算
//计算当前位置r,在整个长度中的最高位数值。
int C(int r, int n) {
int answer = 1;
int a = 1, b = 1;
if (r != 0) {
for (int i = n; i > n - r; i--) {
a = a * i;
}
for (int j = 2; j <= r; j++)
b = b * j;
answer = a / b;
}
return answer;
}

int main() {
int i, j;
char ch[10];
int ch1[10];
cin >> ch;
int n = strlen(ch);
int sum = 1;
int start = 1;
for (i = 1; i < n; i++) //计算第一个位的高位数值
sum += C(i, 26);
for (i = 0; i < n; i++) //取字符串中,字符对应的数字。
ch1[i] = ch[i] - 96;
for (i = n; i >= 1; i--) //对每一个升序数(字符串),进行分别计算,相加。
{
for (j = start; j < ch1[n - i]; j++) {
sum += C(i - 1, 26 - j);
}
start = ch1[n - i] + 1;
}
cout << sum << endl;
system("pause");
return 0;
}追问

能看成进制的转换吗 他的字母没有重复现象 就像10进制的11,有重复 但这个26进制的不能重复出现两个数

本回答被网友采纳
第2个回答  2012-09-24
#include<iostream>
using namespace std;
int C(int r,int n)
{
int answer=1;
int a=1,b=1;
if(r!=0)
{
for(int i=n;i>n-r;i--)
{
a=a*i;// n!/(n-r)!
}
for(int j=2;j<=r;j++)
b=b*j;// r!
answer=a/b;// n!/(r!(n-r)!)
}
return answer;
}
int main ()
{
int i,j;
char ch[10];//用于存放输入字符串
int ch1[10];//用于存放输出数字
cin>>ch;
int n=strlen(ch);//字符串长度
int sum=1;
int start=1;//开始位,因为没有aa这个字符,所以aa要跳1位到ab,后面同理
for(i=1;i<n;i++)
sum+=C(i,26);// 累加n!/(r!(n-r)!) (r=1,2,...25,n=26)
for(i=0;i<n;i++)
ch1[i]=ch[i]-96;//因为字符串全部是小写,ASCII表的a 是 97 ,减去96代表24个字符的顺序
for(i=n;i>=1;i--)//按字符串长度计算
{
for(j=start;j<ch1[n-i];j++)//数组里的第n-i个字符的对应值计算,比如abc 先计算 a
{
sum+=C(i-1,26-j);
}
start=ch1[n-i]+1;//跳位
}
cout<<sum<<endl;
system("pause");
return 0;
}追问

它的主要思路是什么??

追答

主要思路就是你的题干。他已经说明了密码的构成。根据构成写出算法。核心是那个int C(int r,int n) ,不过你这个程序有点不完善,例如你输入aa 和 ab 结果是一样的。而且这个程序貌似不可靠,你试一下ba bb bc三个数,结果是一样的。你可以自己写一个,思路就是分解他的构成,例如a-z是1-26 ,而ab-az是27-51,因为aa重复要去掉,三位的则有3种重复,分别是aax,axa,xaa,试着把规律找出来吧。

第3个回答  2012-09-24
都是直观的语句,怎么会看不懂?你是不懂思路吧,但是题目已经给出了思路。
所以我现在不懂了,你到底哪里不懂。。。追问

这样吧 你把每个语句后面标上这样写的目的 刚学,什么都还不懂 谢谢了!!

第4个回答  2012-09-24
我也是新手!~求大师们来帮助帮助新手啊!~呵呵O(∩_∩)O~

这是一个C++二级考试的题,请高手指教一下
因此,在A中,首先先执行括号里面的语句y=z=8,得到y==8,z==8,接着执行4*6,得到24,并且该表达式返回第二个表达上的值,也就是24,因此x==24。同理可得B中,z==8,x==24,y==24 C中x==8 y==8 z==8 D中可以把.x=(y=z=8)看成是表达式1,4*6看成是表达式2,因此整个语...

初学C++请高手帮我看看这段代码有什么错误!程序目的是要求运行时从键盘...
1.class Time{ void set_time (void);void show_time(void);这两个函数根本没有定义 2.int set_time(void){ cin>>t.hour;cin>>t.minute;cin>>t.sec;} int show_time(void){ cout<<t,hour<<":"<<t.minute<<":"<<t.sec<<endl;} 这两个函数怎么能去访问别人的私有成员?建议多...

请高手看一下我的这个c++程序错在哪!!
friend Comeplex operator +(Comeplex &,int &);friend Comeplex operator +(int &,Comeplex &);const int &或者直接int就可以了(还有一个不好的办法,不改前面那就只能用变量去代替main函数里面的字面值常量1和5)

请高手帮我看看,这个木材加工的C++程序
我只会用C 写。不难。include "stdio.h"void main(){ int num,*p,i,j,n,k,min;printf("\\nEnter N and K :");scanf("%d%d",&n,&k);p=(int *)malloc(n*sizeof(int));for(i=0;i<n;i++){ scanf("%d",&p[i]);if(i==0)min=p[i];else{ if(min>p[i])min=p[i...

c++11里面的bind函数是什么鬼,看不懂,请高手指教
调用这个函数对象相当于调用用绑定的参数调用fn。下面给你一个使用例子吧:\/\/ bind 用例#include <iostream>#include <functional>\/\/ 自定义的一个函数double my_divide (double x, double y) {return x\/y;}\/\/ 自定义的一个结构体struct MyPair { double a,b; double multiply() {return a...

C++问题! 请高手帮忙!
8)检索(查找)指定信息。(如按姓名检索、按年龄检索)(9)参考界面如下:1-增加一位学生(1年级 2年级)2-显示全部学生(1年级 2年级)3-计算平均成绩(1年级 2年级)4-删除一个学生(1年级 2年级)5-按性别输出学生信息 6-按姓名检索学生 7-按照至少一科成绩进行排序。8-结束程序运行 ...

这里有道程序 我看不懂 请高手指教下 每一步是什么意思? 请赐教
main函数里:struct student stu[11];定义一个结构体数组变量,11个成员变量。int i,j,temp1,temp2,temp3,temp4,temp5;定义计数器i,j和五个临时变量(这五个变量没用到)for(i=1;i<11;++i){ printf("请输入第%d位同学的学号、数学成绩、英语成绩、计算机成绩:\\n",i);scanf("%d%d%d",...

下面一个C语言高手指教下,小弟看不懂!!
第三次循环:先拿2跟2比较,符合,n=n+1,n此时为3,到第一个打印语句,打印一个3和一个“\\t”,就是打印一定宽度的空格,第四次循环:先拿3跟2比较,不符合,n=n+1,n此时为4,但是因为条件不符合,就不进入循环体,退出循环,到第二个打印语句,就打印一个4,再换行。最后结果是:1 ...

C++问题,请高手指教
(‘E’-‘A’):表示两个大写字母的ASCII码的值相减:(A的ASCII码是65,E的ASCII码是69)X*(‘E’-‘A’):表示上面减得的结果和X相乘。a*=x*(‘E’ - ‘A’):表示上面乘得到的结果和a相乘后再赋给a。

关于C++的一道编程题,请高手帮忙阿
因为没有学过文件,所以不太看得懂题,还请高手指点一下文本编辑器要求:(1)编辑文本;(2)保存、打开指定位置的文本文件;(3)具有输入输出界面。... 因为没有学过文件,所以不太看得懂题,还请高手指点一下 文本编辑器要求:(1)编辑文本;(2)保存、打开指定位置的文本文件;(3)具有输入输出界面。 展开 ...

相似回答