C语言 杨辉三角打印 结果错

结果不对啊
编程打印具有如下形式的杨辉三角形,其中输出数据的行数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;
}

好吧,忘记杨辉三角的概念了,重新查了下

img

然后拿你的代码调试了下,发现有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;
}

运行截图

img

img

与预期一致

希望能有用,祝你顺利