我正在写一个程序,打印出pascal的行数,它会一直打印到第14行,它的值是13.我已经将问题缩小到我所做的Choose函数,它似乎在"12 Choose X"之后产生了不正确的值,我不知道为什么.

以下是我为计算阶乘的函数(似乎工作正常)和有问题的函数编写的代码.还包括复制和粘贴在第14排之后产生的三角形.

另外,作为参考,做printf("%ld \n", choose(13, 1));的结果是4.它应该是13.

long factorial(int value)
{
    int i;
    long running = 1;
    for (i = 1; i <= value; i++)
    {
        running *= i;
    }
    return running;
}

long choose(int n, int k)
{
    if (n < k)
        return 0; 

    return factorial(n) / (factorial(k) * factorial(n - k));
}

1 1-4-1 2 4 7 9 9 7 4 2-1-4 1 1

10 1 5 14 29 44 44 29 14 5 1

1 4 24 88 221 399 532 532 399 221 88 24 41&-问题开始的地方.

1 12 66 220 495 792 792 495 220 66 12 1

1 1 55 165 330 462 330 330 165 55 11 1

1 10 45 120 210 252 210 120 45 10 10

19 36 84 126 84 36 36 91

18 28 56 70 56 28 8 1

17 21 35 35 21 7 1

16,15,20,15,6,1.

1 5 10 10 5 1 1

1 4 6 4 1

1 3 3 1

1 2 1.

1 1 1.

1

我曾try 将类型从Int更改为Long,以为这是数据问题,但事实并非如此.

Edit: This is the code that prints the triangle:

int main(int argc, char **argv)
{
    int i, numRows, j;
    /*printf("%ld \n", factorial(13));
    printf("%ld \n", choose(13, 1));*/
    if (argc==2)
    {
        char *ptr;
        numRows = strtol(argv[1], &ptr,10);

        for(i=numRows; i>0; i--)
        {
            for(j=numRows - i; j>0; j--)
            {
                printf("  ");
            }
            printRow(i);
        }
        return 0;
    }
    return 1;
    
}

void printRow(int row)
{   
    int i;
    for(i=0; i<=row-1; i++)
    {
        if(i!=row-1)
            printf("%d   ",choose(row-1, i));
        else
            printf("%d \n",choose(row-1, i));
    }
}

推荐答案

阶乘13!将溢出32位整数,21!将溢出64位整数.有一种方法可以绕过这一点,那就是使用一个连续的术语.

这里有一种输出Pascal三角形行的方法,不需要阶乘.

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

void PascalRow(int row)
{
    long long term = 1;
    int multiplier = row;
    int divisor = 1;
    printf("1");
    for(int i=0; i<row; i++) {
        term = term * multiplier / divisor;
        printf(" %lld", term);
        multiplier--;
        divisor++;
    }
    printf("\n");
}

int main(int argc, char *argv[]) {
    if(argc < 2)
        return 1;
    PascalRow(atoi(argv[1]));   // note: improve this
    return 0;
}

计划会议

test 6
1 6 15 20 15 6 1 

test 15
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1 

C++相关问答推荐

我编译了一个新的c程序,并收到以下错误

正确的TCP/IP数据包 struct

在C++中通过空指针隐式访问常量变量的值

非正规化边缘毛刺

初始变量重置后,char[]的赋值将消失

整型文字后缀在左移中的用途

加密解密工作正常,但返回错误0x80090005

MacOS下C++的无阻塞键盘阅读

在C++中允许使用字符作为宏参数

链表删除 node 错误

如何对现有的双向循环链表进行排序?

为什么Linux无法映射这个PT_LOAD ELF段?

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

在C中使用无符号整数模拟有符号整数

挥发性语义的形式化理解

C程序printf在getchar while循环后不工作

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

使用 SDL2 的 C 程序中的内存泄漏

为什么这里的符号没有解析?

这种 C 函数风格的名称是什么?