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

2025-02-03 06:57:59
推荐回答(5个)
回答1:

#include
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 sum+=C(i,26);

for(i=0;ich1[i]=ch[i]-96;

for(i=n;i>=1;i--)//确定Ch的位数后,对每一位进行排列组合的分析,假设 Ch = “bdfr”,则先判断第一位b之前的四位字符串总和 ,下面解释都是以第一次循环做解释
{
for(j=start;j{
sum+=C(i-1,26-j);//排列组合 见解释B
}
start=ch1[n-i]+1;//计算第一位“b”之前的四位字符串总和之后,开始计算第二位“d”之前的四位字符串总和,此时第一位已经固定 ,第二位应该从(第一位+1)的字符开始考虑····所以start=ch1[n-i]+1
}
cout<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()函数已经排除了这些不合要求的字符串,所以只要输入的字符串符合要求,得出的结果一定是正确的

回答2:

这是一个字符串转数字编码的程序。
也就是可以看成是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;
}

回答3:

#include
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;isum+=C(i,26);// 累加n!/(r!(n-r)!) (r=1,2,...25,n=26)
for(i=0;ich1[i]=ch[i]-96;//因为字符串全部是小写,ASCII表的a 是 97 ,减去96代表24个字符的顺序
for(i=n;i>=1;i--)//按字符串长度计算
{
for(j=start;j{
sum+=C(i-1,26-j);
}
start=ch1[n-i]+1;//跳位
}
cout<system("pause");
return 0;
}

回答4:

都是直观的语句,怎么会看不懂?你是不懂思路吧,但是题目已经给出了思路。
所以我现在不懂了,你到底哪里不懂。。。

回答5:

我也是新手!~求大师们来帮助帮助新手啊!~呵呵O(∩_∩)O~