其实,用一维数组,就可以了。
#include<stdioh>void main(void)
{
int x[20] = {0};
int i, j, k, t;
for (i = 0; i < 20; i++) x[i] = 0;
x[0] = 1;
for (i = 0; i < 16; i++) {
k = 0; j = 0;
while(1) {
t = j + x[k];
j = x[k];
x[k] = t;
k++;
if (t == 0) break;
printf("%d ", t);
}
printf("\n");
}
}
方法有很多很多
比如 用多维数组
比如用一维数组
比如用动态存储
比如递归计算。。。
太多了
随便给你一种
#include<stdioh>int main( )
{int n,i,j,a[10][10]={1};
scanf("%d",&n);
for(i=0;i<=n;i++) //共有n+1行
{ a[i][0]=1; //每行首元素为1
for(j=1;j<=i;j++) //其余元素值,等于左上+右上二数之和
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=0;i<=n;i++) //打印n+1行
{
for(j=0;j<n-i;j++) //打印行前的空格
printf(" ");
for(j=0;j<=i;j++) //每行上有i+1个值
printf("%4d",a[i][j]);
printf("\n"); //一行结束,换行
}
return 0;
}
我很久之前写过这个,但是当时用的是栈区数组固定长度,你改成动态数组即可。
void main()
{
int a[10] = { 1 };
for (int i = 0; i < 10; i++) //用循环打印第一行
{
if (a[i] == 0)
{
printf("%4c",' ');
}
else
printf("%4d", a[i]);
}
//先输出第一行之后再进行循环
for (int j = 2; j <= 10; j++)
{
printf("\n"); //回车输入第二行
// printf("1 "); //输入每一行开头的1
for (int i = 9; i >= 0; i--)
{
if (i != 0) //实现每行的第一个数均为一,后面的数才开始符合规则
{
a[i] = a[i] + a[i - 1];
}
else
a[i] = 1;
}
for (int i = 0; i < 10; i++) //打印每一行
{
if (a[i] == 0)
printf("%4c",' ');
else
printf("%4d ", a[i]);
}
}
system("pause");
}
第一个问,是为了不让数组超界。
第二个问,同样,赋值这样是为了使得第一排的第一个数为1,这是杨慧三角的定义,顶角必须为1,否则后面的数字算不出来。其他的位置的值都是通过第一排的中间那个1(也就是a[0][10])算出来的,杨慧三角第n层的值和第n-1层有关。
第三个问,因为你中间计算的时候为了成图中的三角形,所以两个数中间隔了一个数,而这个数的值没有被赋值,因为这个位置不是杨辉三角的部分,所以就是你先前给他的那个0,因此当为0时输出空格
用一维数组就搞定了。
#include "stdafxh"
#include <stdioh>
void main()
{ int i,j,a[17]={0,1},l,r;
for(i=1;i<=6;i++)
{ l=0;
for(j=1;j<=i;j++)
{ r=a[j];
a[j]=l+r; //每个数是上面两数之和
l=r;
printf("%5d",a[j]); //输出杨辉三角
}
printf("\n");
}
}
分步来看,从i=0开始,打印1,j初始化为i即0,不满足第一个for,再初始化j为1,不满足第二个for,换行。第一行输出:1。
第二次,i=1,打印1,j=i=1,满足,由于mamset已使数组全为零。数组[1]=0+1=1。j<=i,输出数组[1],换行。则第二行输出1 1。
不难发现,在第二个for中先输出的,始终是数组[1],而每一次大的for循环中,数组[1]=数组[1]+数组[0],由于数组[0]是1不可更改,所以杨辉三角中每一行从左往右第一个不为一的数字,总是按列逐个+1的。
不难看出,第一个for中,数组[j]总等于数组[j]+数组[j-1],数组j是杨辉三角中每一行最右边的数,它总等于它自己(0)加上上一行最右边的数。所以每一列的最右边总是1。
然后是最重要的一个,除每一行最右边的数组[j]外,每一个数组都等于它原来的值加上它前面数组的值,也就是它的值等于上一行的同列元素(从左往右数序号相同)和该元素左边元素之和,这正好满足了杨辉三角的定义。
所以,第一个for的作用是实现杨辉三角的定义(一个元素等于上一行对应两个元素之和)。
第二个for是从左到右输出数组。
可以不用二维数组,改用一维数组。
如果有改为不用数组,那就使用计算阶乘的方法,计算效率较低,而且容易“溢出”不能算得较多的行数。如果要改为能得到用数组同样的行数,则程序的编写就要用麻烦的算法。
以上就是关于用c语言写的杨辉三角出错,求大神看看哪里错了全部的内容,包括:用c语言写的杨辉三角出错,求大神看看哪里错了、c语言怎么编程杨辉三角有几种方法,请大神解答并写出,要语言编的、c语言程序杨辉三角等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)