【问题标题】:How to turn the Pascal triangle upside down in C, so the first row is printed last, and the last row is printed first?如何在C中将帕斯卡三角形倒置,所以第一行最后打印,最后一行先打印?
【发布时间】:2018-10-31 17:09:59
【问题描述】:

我创建了一个程序,它会询问用户有关帕斯卡三角形的输入,然后根据他们的输入输出它,它可以工作,但是,我现在需要将其倒置,以便最后一行是首先打印,第一行最后打印。我想到了两种方法,但不完全确定如何执行它们。一种方法是更改​​循环,因为我有 3 个 For 循环,并且每次都添加 1,所以不是加 1,而是减去 1,但是,我认为这不会工作,因为这意味着循环中的起始值必须大于行数,并且当变量中的值等于或大于行数时循环终止。我想到的另一种方法是重新定位 printf 函数,但不完全确定该怎么做。

我的代码:

for (i=0; i < rows; i++)

【问题讨论】:

  • 通过阶乘计算二项式系数效率低下,并且由于中间计算溢出而很快产生不正确的结果。
  • 在帕斯卡三角中,每个不在边上的数字都是它上面的两个数字的和。尝试以这种方式产生数字。

标签: c


【解决方案1】:

以下code 可以用于三种情况。

测试:./a.out 5

case 1: 

                   1    
               1       1    
           1       2       1    
       1       3       3       1    
   1       4       6       4       1    


 case 2: 

   1       4       6       4       1    
       1       3       3       1    
           1       2       1    
               1       1    
                   1    


 case 3: 

                   1    
               1       1    
           1       2       1    
       1       3       3       1    
   1       4       6       4       1    
       1       3       3       1    
           1       2       1    
               1       1    
                   1    

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc != 2)
        return -1;

    char* ptr;
    int rows = strtol(argv[1], &ptr, 10);
    if (rows < 1 || rows > 10 || *ptr != '\0')
    {
        printf("Error\n");
        return 1;
    }

    int f[20][20];

    for (int i = 0; i < rows; ++i)
        f[i][i] = f[i][0] = 1;
    for (int i = 2; i != rows; ++i)
        for (int j = 1; j != i; ++j)
            f[i][j] = f[i-1][j] + f[i-1][j-1];

    printf("\n\n case 1: \n\n");
    for (int i = 0; i < rows; ++i)
    {
        for (int j = 0; j < rows - i - 1; ++j)
            printf("%4c", ' ');
        for (int j = 0; j <= i; ++j)
            printf("%4d%4c", f[i][j], ' ');
        printf("\n");
    }

    printf("\n\n case 2: \n\n");
    for (int i = rows - 1; i >= 0; --i)
    {
        for (int j = 0; j < rows - i - 1; ++j)
            printf("%4c", ' ');
        for (int j = 0; j <= i; ++j)
            printf("%4d%4c", f[i][j], ' ');
        printf("\n");
    }

    printf("\n\n case 3: \n\n");
    for (int i = 0; i < rows; ++i)
    {
        for (int j = 0; j < rows - i - 1; ++j)
            printf("%4c", ' ');
        for (int j = 0; j <= i; ++j)
            printf("%4d%4c", f[i][j], ' ');
        printf("\n");
    }

    for (int i = rows - 2; i >= 0; --i)
    {
        for (int j = 0; j < rows - i - 1; ++j)
            printf("%4c", ' ');
        for (int j = 0; j <= i; ++j)
            printf("%4d%4c", f[i][j], ' ');
        printf("\n");
    }



    return 0;
}

【讨论】:

  • 谢谢!我已经查看了您的案例 2 并在我的案例中进行了镜像,它完全按照我想要的方式工作,但是有一个问题,在打印三角形后,程序似乎仍在等待输入而不是结束,我必须关闭整个终端。你知道如何解决这个问题吗?
  • @JohnCenaFanboi 把long unsigned int i, j, rows;换成int i, j, rows;就OK了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多