本来想改改你的程序,但是你这逻辑太混乱了,很多错误,改不过来,自己写了一个类,里面设计了一个方法draw(int n),在main方法里调用,想画几行传几就行了,。
逻辑上主要是处理每行的前面空格的输出数量,以及从第三行起,数字的输出与前一行数字的关系。 我这里定义了一个二维数组a[][] = new [n][],它的第一维长度是传进来的n值(即画几行)。从第三行,每行的首数字跟尾数字都是1中间的数字是前一行的前一个数字加上前一行对应本行这个数字,比如第三行中,a[2][0]跟a[2][2]都是1,a[2][1] = a[1][0] + a[1][1],这样就可以总结对应数字跟n以及各循环里控制变量的关系了,然后输出来每个元素后面加个空就行了,最后每行后面输个换行,程序就完成了。
有输出界面截图, draw方法的截图,以及整个类文件内容跟java文件附件。
public class TestYangHui {
public static void main(String[] args) {
draw(10); //调用画三角方法,可以随意传入正整数,传几画几行
}
private static void draw(int n) { //自定义的画三角方法
int a[][] = new int[n][]; //定义了一个二维整数数组,指定第一维长度为传入的n
for (int i=1; i<=n; i++) { //最外层for循环控制第一行到第n行的输出行数
for (int j=1; j<=n-i; j++) { //这个for循环控制前面空格输出数量,如n为10,则第一行空格n-1即9个
Systemoutprint(" ");
}
if (i == 1) { //if语句区分第一行跟第二行与之后行的不同输出。
a[i-1] = new int[i];
a[0][0] = 1;
Systemoutprint("1");
} else if (i == 2) { //这是第二行
a[i-1] = new int[i];
Systemoutprint(1 + " " + 1);
a[1][0] = 1;
a[1][1] = 1;
} else if (i >= 3) { // 这是第三行已经超过3的行输出。
a[i-1] = new int[i]; // 指定对应行的第一纬数组元素的二维长度
for (int k=0; k<i; k++) { // 这个for循环是第三行以及以后的数组元素赋值
if(k == 0 || k ==i-1){ // 每行的开始跟结束元素值为1
a[i-1][k] = 1;
}else {
a[i-1][k] = a[i-2][k-1] + a[i-2][k];//如果不是开始跟结束元素,则他的值是上一行的前个元素加上一行的对应的元素。
}
Systemoutprint(a[i-1][k] + " "); //输入元素,后面加个空。
}
}
Systemoutprintln(); //每行输出结束后输出个换行
}
}
}
杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。
求杨辉三角的c++程序
#include<iostream>
using namespace std;
int main()
{
int i,j,h,a[10][10];
cout<<"请输入杨辉三角的高度:"<<endl;
cin>>h;
for(i=0;i<=h;i++)
{
for(j=0;j<=i;j++)
{
if(i==j||j==0)
a[i][j]=1;
else
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(i=0;i<=h;i++)
{
for(j=h;j>=i;j--)
cout<<" ";
for(j=0;j<=i;j++)
{
cout<<a[i][j]<<'\t';
if(i==j)
cout<<endl;
}
}
return 0;
}
先定义一个二维数组:a[N][N],略大于要打印的行数。再令两边的数为1,即当每行的第一个数和最后一个数为1。a<i>[0]=a<i>[i-1]=1,n为行数。除两边的数外,任何一个数为上两顶数之和,即a<i>[j]=a[i-1][j-1]+a[i-1][j]。最后输出杨辉三角。代码如下:
#include<stdioh>
#define N 14
void main()
{
int i,j,k,n=0,a[N][N];/定义二维数组a[14][14]/
while(n<=0||n>=13){/控制打印的行数不要太大,过大会造成显示不规范/
printf("请输入要打印的行数:");
scanf("%d",&n);
}
printf("%d行杨辉三角如下:\n",n);
for(i=1;i<=n;i++)
a<i>[1]=a<i><i>=1;/两边的数令它为1,因为现在循环从1开始,就认为a<i>[1]为第一个数/
for(i=3;i<=n;i++)
for(j=2;j<=i-1;j++)
a<i>[j]=a[i-1][j-1]+a[i-1][j];/除两边的数外都等于上两顶数之和/
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++)
printf("");/这一行主要是在输出数之前打上空格占位,让输出的数更美观/
for(j=1;j<=i;j++)/j<=i的原因是不输出其它的数,只输出我们想要的数/
printf("%6d",a<i>[j]);
printf("\n");/当一行输出完以后换行继续下一行的输出/
}
printf("\n");
}
运行结果:
请输入要打印的行数:9
9行杨辉三角如下:
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
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
扩展资料:
杨辉三角概述:
1每个数等于它上方两数之和。
2每行数字左右对称,由1开始逐渐变大。
3第n行的数字有n+1项。
4第n行数字和为2n。
5第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
6第n行的第m个数和第n-m+1个数相等,为组合数性质之一。
7每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即C(n+1,i)=C(n,i)+C(n,i-1)。
8(a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。
9将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个斐波那契数;将第2n行第2个数(n>1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
参考资料:
百度百科——杨辉三角
但因为杨辉三角是对称的,所以只要算一半就可以了,所以k2=ceil(k/2)而l=2:k2,也就是yh(l)只算到了k的一半。然后后一半只要用前一半对称过来就可以了,即yh(k2+1:k)=yh(k-k2:-1:1)。
以下是我对程序的改进:
程序是从第3行开始循环的,而前两行则直接定义了。但实际上只要定义第一行就可以了,第二行用下面的循环一样可以做出来。也就是说yh=[1,1]; disp(yh); 这一行可以去掉,然后把 k=3:n 换成k=2:n就可以了。然后if n==1, return; end 这一行也就不需要了,可以去掉。
原程序只算了前一半,后一半用对称实现,实际上完全可以用“每一行的数值就是上一行两个元素的和”这个关系把这一行全部算出来,也不用对称了,而且连循环都不需要。下面就是改进的程序:
function printyh(n)
% 打印杨辉三角形, 本函数没有输出参数
yh=1; disp(yh);
for k=2:n
yh=[yh,0]+[0,yh];
yh(k)=1;
disp(yh);
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)