m0_70667089 2022-05-27 22:47 采纳率: 40%
浏览 50
已结题

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;
}

  • 写回答

1条回答 默认 最新

  • 李林罡 2022-05-28 10:15
    关注

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

    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

    与预期一致

    希望能有用,祝你顺利

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 已采纳回答 5月28日
  • 创建了问题 5月27日

悬赏问题

  • ¥20 怎么在stm32门禁成品上增加记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 解riccati方程组