jjzjj

Java语言实现杨辉三角

Hik_uan欢 2023-07-18 原文

一.提出问题。
使用二维数组打印出如下图的杨辉三角。

二.分析问题。
1.首先想要输出杨辉三角,就要找到它有什么规律?
①第n行有n个数字;
②每一行开始和结束的数字都为1;
每一个数字都等于它的左上角的数字与右上角数字之和
2.其次题目要使用二维数组打印杨辉三角,我们该如何用二维数组表示?
我们可以创建一个二维数组,来表示杨辉三角的行和列。空白的位置我们可以用数字0表示。通过题目所给出的图,我们可以看出,这是一个10行,21列的杨辉三角。

//创建二维数组
 int[][] arr=new int[10][21];


得到这个初始二维数组,我们可以根据杨辉三角的规律进行遍历赋值。
3.如何给二维数组赋值?
有题目给出的图片可得,第一行只有一个数字且永远为1,所以我们可以先给第一行进行赋值,然后根据规律向下展开赋值。
赋值时要注意杨辉三角行和列的表示与二维数组索引的关系。索引是从0开始的,所以第n行应该是n-1;

//对第一行最中间的数赋值
arr[0][10]=1;
//根据杨辉三角的规律,使用二维数组遍历,赋值
for(int i=1;i< arr.length;i++){//第一行已经赋值,所以从第2行开始到第10行
  for(int j=1;j<arr[i].length-1;j++){//由于每一行的最左列和最右列分别没有左上值和右上值,所以每一行的遍历应从第2列开始到第20列
             
      arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];//杨辉三角中的值等于它的左上角的值+右上角的值。

            }
        }

4.经过第三步给二维数组赋值之后,我们应如何输出这个杨辉三角呢?
将第三步得出的二维数组与题目所给的杨辉三角进行比较后发现,输出时,为0的话不能输出,要用空格代替,输出不为零的数。

 //遍历输出杨辉三角
  for(int i=0;i< arr.length;i++){ //从第一个一维数组开始
       for(int j=0;j<arr[i].length;j++){//输出第i个一维数组中的值
               if(arr[i][j]!=0){ //如果值不等于零时,将它输出
                    System.out.print(arr[i][j]+" ");
             }else{ //如果值等于零,用空格代替
                    System.out.print(" ");
                }
            }
            System.out.println();
        }


得出此杨辉三角我们发现,这并不是一个等边三角形,所以此时我们需要使用“\t”来代替“ ”;
"\t"相当于表格制表符tab键,一个格内放8的整数倍的字符,根据显示的字符串长度,剩下的显示空格数。
三.解决问题。
经过一系列的分析,我们可以得到解决这个问题的完整代码:

public class Yhsanjiao {
    public static void main(String[] args) {
    //第一步:创建二维数组
        int[][] arr=new int[10][21];
   //第二步:根据杨辉三角的规律,对二维数组遍历赋值
        //给第一行最中间赋值1
        arr[0][10]=1;
        for(int i=1;i< arr.length;i++){
            //每一行从第二个数开始到倒数第二个结束,因为最左边没有左上的值,最右边没有右上的值都为0
            for(int j=1;j<arr[i].length-1;j++){
                //杨辉三角中的值等于它的左上角的值+右上角的值。
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];

            }
        }
   //第三步:遍历输出杨辉三角
        //从第一个一维数组开始
        for(int i=0;i< arr.length;i++){
            //输出第i个一维数组中的值
            for(int j=0;j<arr[i].length;j++){
                //如果值不等于零时,将它输出
                if(arr[i][j]!=0){
                    System.out.print(arr[i][j]+"\t");
                //如果值等于零,用空格代替
                }else{
                    System.out.print(" \t");
                }
            }
            System.out.println();
        }
    }
}


四.代码优化。
以上题目需要输出一个10层的等边杨辉三角,我们可以对层数进行一个输入,这样需要几层输入几层就可以。

import java.util.Scanner;

public class Yhsanjiao {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        System.out.println("请输入杨辉三角的层数:");//为了输出美观,层数不要超过13.若层数需要超过13,可以通过添加输出杨辉三角中的"\t"来运行。
        int row=s.nextInt();//输入一个杨辉三角的层数。
        //确定二维数组的长度
        /*
        这个二维数组中有row个一维数组;
        因为通过杨辉三角的规律,第零行有一个值,第一行有三个值(包含0),第二行有五个值以此类推,第row行有2*row+1个值;
        所以每个一维数组的长度为2*row+1;
         */
        int[][] arr=new int[row][2*row+1];

        //给第一行最中间赋值1
        arr[0][row]=1;
        //将杨辉三角中的数表示出来    第一行arr[0][row]直接赋值,所以从第二行开始
        for(int i=1;i< arr.length;i++){
            //每一行从第二个数开始到倒数第二个结束,因为最左边没有左上的值,最右边没有右上的值都为0
            for(int j=1;j<arr[i].length-1;j++){
                //杨辉三角中的值等于它的左上角的值+右上角的值。
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];

            }
        }
        //遍历输出杨辉三角
        //从第一个一维数组开始
        for(int i=0;i< arr.length;i++){
            //输出第i个一维数组中的值
            for(int j=0;j<arr[i].length;j++){
                //如果值不等于零时,将它输出
                if(arr[i][j]!=0){
                    System.out.print(arr[i][j]+"\t");
                //如果值等于零,用空格代替
                }else{
                    System.out.print(" \t");
                }
            }
            System.out.println();
        }



    }
}

有关Java语言实现杨辉三角的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐