c语言输出杨辉三角,行数过大时出现错误

在行数超过13行时,后面的数据开始出现错误。

img


#define_CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{ int up = 1, under = 1;
int data[200][200];
int size;
printf("请输入杨辉三角的行数:");
scanf("%d",&size);
for (int i = 0; i < size; i++)// 获取杨辉三角中每一行
{
for (int j =0; j <=i; j++)//获取每行中的每一个元素的值
{
for (int z = 0; z < j; z++)//C(i,j)=j(j-1)../i!== up/under(设的变量)
{
under = under * (z+1);
}
for (int m = 0; m <j; m++)
{
up = up * (i - m);
}
data[i][j] = up / under;
up = 1, under = 1;//重置
}
}
for (int i = 0; i < size; i++)//输出结果
{
for (int j = 0; j <=i; j++)
{
printf("%d ", data[i][j]);
}
printf("\n");
}
return 0;
}

img

中间数据up在第13行之以后就存在溢出的情况,简单点的改法是把int换成long long,好一点的改法是修改算法,就是line[i][j] = line[i-1][j-1] + line[i-1][j];

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
    long long up = 1, under = 1;
    long long data[200][200];
    long long size;
    printf("请输入杨辉三角的行数:");
    scanf("%lld", &size);
    for (long long i = 0; i < size; i++)// 获取杨辉三角中每一行
    {
        for (long long j = 0; j <= i; j++)//获取每行中的每一个元素的值
        {
            for (long long z = 0; z < j; z++)//C(i,j)=j(j-1)../i!== up/under(设的变量)
            {
                under = under * (z + 1);
            }
            for (long long m = 0; m < j; m++)
            {
                up = up * (i - m);
            }
            data[i][j] = up / under;
            up = 1, under = 1;//重置
        }
    }
    for (long long i = 0; i < size; i++)//输出结果
    {
        for (long long j = 0; j <= i; j++)
        {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
    return 0;
}

int 存储的数据大小有限制