一个c++ 程序看不懂 请高手指教!!! 50
//字母序问题//在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写英文字母组成A={a,b,…,z}。该字母表产生的升序字符串是指字符串中字...
//字母序问题
//在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表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;
}
这是在百度上查的程序,但是,最主要的是看不懂
求讲解!!!
急!!! 谢谢了!!!!!! 展开
//在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表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;
}
这是在百度上查的程序,但是,最主要的是看不懂
求讲解!!!
急!!! 谢谢了!!!!!! 展开
5个回答
展开全部
#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()函数已经排除了这些不合要求的字符串,所以只要输入的字符串符合要求,得出的结果一定是正确的
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()函数已经排除了这些不合要求的字符串,所以只要输入的字符串符合要求,得出的结果一定是正确的
展开全部
这是一个字符串转数字编码的程序。
也就是可以看成是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;
}
也就是可以看成是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进制的不能重复出现两个数
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
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,试着把规律找出来吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都是直观的语句,怎么会看不懂?你是不懂思路吧,但是题目已经给出了思路。
所以我现在不懂了,你到底哪里不懂。。。
所以我现在不懂了,你到底哪里不懂。。。
追问
这样吧 你把每个语句后面标上这样写的目的 刚学,什么都还不懂 谢谢了!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也是新手!~求大师们来帮助帮助新手啊!~呵呵O(∩_∩)O~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询