java初级编程 关于杨辉三角

java初级编程 关于杨辉三角,第1张

本来想改改你的程序,但是你这逻辑太混乱了,很多错误,改不过来,自己写了一个类,里面设计了一个方法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&lt;i&gt;[0]=a&lt;i&gt;[i-1]=1,n为行数。除两边的数外,任何一个数为上两顶数之和,即a&lt;i&gt;[j]=a[i-1][j-1]+a[i-1][j]。最后输出杨辉三角。代码如下:

#include&lt;stdioh&gt;

#define N 14

void main()

{

int i,j,k,n=0,a[N][N];/定义二维数组a[14][14]/

while(n&lt;=0||n&gt;=13){/控制打印的行数不要太大,过大会造成显示不规范/

printf("请输入要打印的行数:");

scanf("%d",&n);

}

printf("%d行杨辉三角如下:\n",n);

for(i=1;i&lt;=n;i++)

a&lt;i&gt;[1]=a&lt;i&gt;&lt;i&gt;=1;/两边的数令它为1,因为现在循环从1开始,就认为a&lt;i&gt;[1]为第一个数/

for(i=3;i&lt;=n;i++)

for(j=2;j&lt;=i-1;j++)

a&lt;i&gt;[j]=a[i-1][j-1]+a[i-1][j];/除两边的数外都等于上两顶数之和/

for(i=1;i&lt;=n;i++){

for(k=1;k&lt;=n-i;k++)

printf("");/这一行主要是在输出数之前打上空格占位,让输出的数更美观/

for(j=1;j&lt;=i;j++)/j&lt;=i的原因是不输出其它的数,只输出我们想要的数/

printf("%6d",a&lt;i&gt;[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&gt;1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。

参考资料:

百度百科——杨辉三角

他的意思就是说杨辉三角每一行的数值就是上一行两个元素相加得到的。yh_old就是上一行的元素,yh就是这一行,然后yh(l)=yh_old(l-1)+yh_old(l)就是这意思。
但因为杨辉三角是对称的,所以只要算一半就可以了,所以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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12776104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存