结果不对啊
编程打印具有如下形式的杨辉三角形,其中输出数据的行数n从键盘输入,并且n<=10。
程序运行结果示例1:
Input n (n<=10):
5↙
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
程序运行结果示例2:
Input n (n<=10):
7↙
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
#include <stdio.h>
int Fun(int x);
main()
{
int x,a,r,j,m,n;
printf("Input n (n<=10):\n");
scanf("%d", &x);
for(r=1;r<=x;r++)
{
for(j=1;j<=r;j++)
{
n = r - 1, m = j - 1;
a = (float)Fun(n) / (float)Fun(m) * (float)Fun(n - m);
if(j == r)
printf("%4d\n", a);
else
printf("%4d", a);
}
}
}
int Fun(int x)
{
int sum=1,i=0;
if(x==0)
return 1;
for(i;i<=x;i++)
{
sum = sum * i;
}
return sum;
}
好吧,忘记杨辉三角的概念了,重新查了下
然后拿你的代码调试了下,发现有2个地方有问题
1、计算阶乘的函数int Fun(int x) 内 i 应该从1开始
2、计算组合的表达a = (float)Fun(n) / (float)Fun(m) * (float)Fun(n - m);除号后面需要加上括号
修改优化后,代码如下
#include <stdio.h>
int Fun(int x);
int main()
{
int x, a, r, j, m, n,space,i;
printf("Input n (n<=10):\n");
scanf("%d", &x);
for (r = 1; r <= x; r++)
{
for(space=0; space <= x-r; space++)
printf("%2c",' ');//每一行前面输出些空格 排列的好看一点
for (j = 1; j <= r; j++)
{
//杨辉三角的每一项都是对应二项式(x+y)^n展开的系数,n为行数减去1
//当 r =1 时 是第一行,对应的二项式是 (x+y)^0 即 (1)
//当 r =2 时 是第二行,对应的二项式是 (x+y)^1 即 (1)x+(1)y
//当 r =3 时 是第三行,对应的二项式是 (x+y)^2 即 (1)x^2+(2)xy+(1)y^2
//当 r =4 时 是第三行,对应的二项式是 (x+y)^3 即 (1)x^3+(3)x^2y+(3)xy^2+(1)y^3
//于是有
n=r-1;//n为二项式(x+y)^n 的指数
//当 r =1 时 有1个系数 分别为: 从0个数中取0个的组合数(1) 则 m={0}
//当 r =2 时 有2个系数 分别为: 从1个数中取0个的组合数(1),从1个数中取1个的组合数(1) 则 m={0,1}
//当 r =3 时 有3个系数 分别为: 从2个数中取0个的组合数(1),从2个数中取1个的组合数(2),从2个数中取2个的组合数(1) 则 m={0,1,2}
//当 r =4 时 有4个系数 分别为: 从3个数中取0个的组合数(1),从3个数中取1个的组合数(3),从3个数中取2个的组合数(3),从3个数中取3个的组合数(1) 则 m={0,1,2,3}
//于是有
m = j-1;//m为二项式展开后的下标 从0开始
//二项式系数,就是对应位置处的组合数
// a = (float)Fun(n) / Fun(m) * Fun(n - m);//这里注意优先级,需要把除号后面的表达式加上括号
a = (float)Fun(n) / (Fun(m) * Fun(n - m));
printf("%4d", a);
}
printf("\n");//每一行输出完成后换行
}
return 0;
}
//这个函数应该是求阶乘的值的
int Fun(int x)
{
//int sum = 1, i = 0;
int sum = 1, i = 1;//阶乘是从1开始的,改i=0 为i=1
if (x == 0)
return 1;
for (i; i <= x; i++)
{
sum = sum * i;
}
return sum;
}
运行截图
与预期一致
希望能有用,祝你顺利