小白自学,大家帮忙看看这个程序是否正确? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
weiyuzhou
V2EX    程序员

小白自学,大家帮忙看看这个程序是否正确?

  •  1
     
  •   weiyuzhou 2017-10-23 22:00:19 +08:00 5409 次点击
    这是一个创建于 2923 天前的主题,其中的信息可能已经有所发展或是发生改变。

    门外汉自学入门,刚刚看到 if 分支语句,做完了书上的习题输入三个数并输出最大数的习题后我就在想能不能更难一点,输入四个数试试?然后我就瞬间感觉脑子不够用了,反反复复写了近半个小时写出了下面的代码,测试了一下好像也没有什么问题,但是总感觉怪怪的...

    想请教下大家这段代码对不对或者是否有任何需要改进的地方? 我知道肯定有更简单的算法,但是鉴于别的我也看不懂,所以就限定是用判断语句并且不考虑特殊情况。 代码如下:

    import java.util.Scanner; public class Largest { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Please enter four numbers: "); int number1 = input.nextInt(); int number2 = input.nextInt(); int number3 = input.nextInt(); int number4 = input.nextInt(); int largest = 0; if (number1 > number2) { if (number1 > number3) { if (number1 > number4) { largest = number1; }else { largest = number4; } }else { if (number3 > number4) { largest = number3; }else { largest = number4; } } }else if (number2 > number3) { if (number2 > number4) { largest = number2; }else { largest = number4; } }else { if (number3 > number4) { largest = number3; }else { largest = number4; } } System.out.println(largest); } } 
    54 条回复    2017-10-25 08:44:11 +08:00
    weiyuzhou
        1
    weiyuzhou  
    OP
       2017-10-23 22:10:42 +08:00
    忘了说,学的是 java 语言。
    takanasi
        2
    takanasi  
       2017-10-23 22:13:32 +08:00   6
    >>> a=[1,2,3,4]
    >>> max(a)
    4

    人生苦短,快用 python
    weiyuzhou
        3
    weiyuzhou  
    OP
       2017-10-23 22:44:40 +08:00 via Android
    @takanasi 这是 Python 数组吗?看不懂啊…为什么都没人回复我…
    yejinmo
        4
    yejinmo  
       2017-10-23 22:51:34 +08:00
    List<int> list= new List<int>(){1, 2, 3, 4};
    list.Sort();
    int res = list[list.Count - 1];

    人生苦短,试试 C#
    mjikop1231
        5
    mjikop1231  
       2017-10-23 22:53:18 +08:00
    明明 java 也有 sort
    (不过 java 代码好长啊好长啊好长啊)
    shengkunz
        6
    shengkunz  
       2017-10-23 22:53:41 +08:00 via Android
    应该先排序,然后在输出最大的那个。
    misaka19000
        7
    misaka19000  
       2017-10-23 22:55:47 +08:00   4
    2 楼有点搞笑了,这种东西用库写谁不会写啊

    楼主写的有点麻烦了,简单点的话可以这样:

    int[] array = new int[]{number1, number2, number3, number4};
    for (int i : array) {
    if (i > largest)
    largest = i;
    }
    System.out.println(largest);
    hcnhcn012
        8
    hcnhcn012  
       2017-10-23 23:00:44 +08:00 via iPhone
    >>> print(max([i for i in range(1,5)]))
    4
    hcnhcn012
        9
    hcnhcn012  
       2017-10-23 23:01:25 +08:00 via iPhone
    人生苦短,快用 python
    qiayue
        10
    qiayue  
    PRO
       2017-10-23 23:01:35 +08:00
    说个你比较能理解的,你先三个数比较,找出最大数,然后跟第四个数比较
    nyanyh
        11
    nyanyh  
       2017-10-23 23:03:57 +08:00
    List<Integer> nums = new ArrayList<>();
    nums.add(10);
    nums.add(20);
    nums.add(45);
    nums.add(50);
    nums.add(51);

    int max = Collections.max(nums); // 51
    nyanyh
        12
    nyanyh  
       2017-10-23 23:05:09 +08:00
    算法第四版 Java 实现的一开始就介绍了 Comparable 如何使用,所以我认为使用 Collections 并无任何不妥
    weiyuzhou
        13
    weiyuzhou  
    OP
       2017-10-23 23:09:35 +08:00 via Android
    @qiayue 这个靠谱,能理解!也谢谢大家,感觉脑子不够用,稍微难点的就不知道怎么算了,不知道合不合适学编程…
    weiyuzhou
        14
    weiyuzhou  
    OP
       2017-10-23 23:11:27 +08:00 via Android
    @misaka19000 这个暂时还没学过…谢谢!
    AlwaysBehave
        15
    AlwaysBehave  
       2017-10-23 23:15:54 +08:00
    @nyanyh +1
    看自学主要方向吧
    算法的话直接看底层怎么实现的(数据结构是前提?),应用的话就直接学会快速读懂手册有流程意识?(有拆分问题)
    LxExExl
        16
    LxExExl  
       2017-10-23 23:19:30 +08:00 via iPhone
    楼上排序和用数组的都是二逼 答非所问

    if(a>b && a>c && a>d) largest=a;

    同理 写其他三行就行了
    ipwx
        17
    ipwx  
       2017-10-23 23:22:04 +08:00
    @LxExExl 用 >= 更好。
    misaka19000
        18
    misaka19000  
       2017-10-23 23:22:13 +08:00   1
    @LxExExl
    @Livid
    16 楼人身攻击
    weiyuzhou
        19
    weiyuzhou  
    OP
       2017-10-23 23:25:43 +08:00 via Android
    @LxExExl 与运算,这个我懂,怎么没想到,多谢!
    JamesMackerel
        20
    JamesMackerel  
       2017-10-23 23:27:10 +08:00   2
    不需要这么复杂啊。
    用数组存起来,假设是 num,然后你就:

    largest = num[0];
    for(int t: num){
    if(largest > t) largest = t;
    }

    楼上说的那些先排序再取最大的,考虑正常的排序算法,它们的时间复杂度最优也要 nlogn,而这个方法是 n。
    acgnsstech
        21
    acgnsstech  
       2017-10-23 23:27:35 +08:00
    @takanasi
    @yejinmo

    请看我大 C 艹版本

    int a[4] = { 4,2,3,1 };
    cout<<*max_element(a, a+4)<<endl;
    thet
        22
    thet  
       2017-10-23 23:33:02 +08:00
    可以搜搜排序算法看看
    quickma
        23
    quickma  
       2017-10-23 23:48:50 +08:00
    你们能不能专心解决问题!!!

    其实编码是一个表现思路的过程,一个个比较还是排序还是冒泡啥的,都是思路。

    不必担心代码的难易,前期要专注于思维的培养。
    sagaxu
        24
    sagaxu  
       2017-10-23 23:52:07 +08:00
    IntStream.range(0, 4).map(i -> input.nextInt()).max().ifPresent(System.out::println);
    zjp
        25
    zjp  
       2017-10-24 00:00:54 +08:00 via Android
    同意 #23 楼
    楼上很多方法都能解决问题(用其他语言的过分了啊 。
    #7 #2
    仅仅求最大值,对所有数字排序明显多余。对简单的问题用不简洁的做法多半是思维跑偏了
    zjp
        26
    zjp  
       2017-10-24 00:03:25 +08:00 via Android
    @zjp 手滑
    同意 #23 楼
    楼上很多方法都能解决问题(安利其他语言的过分了啊 。
    #7 #20 用数组
    #11 用集合排序
    #24 用 Java8 的流
    仅仅求最大值,对所有数字排序明显多余。对简单的问题用不简洁的做法多半是思维跑偏了
    zjp
        27
    zjp  
      &bsp;2017-10-24 00:05:28 +08:00 via Android
    @zjp 23333 说那么多原来只能用 if 语句,逗比了
    cstome
        28
    cstome  
       2017-10-24 00:29:31 +08:00
    歪个楼;
    我觉得入门写代码的话其实可以从简单的语言,比如 python 甚至 JS 入门,等你熟悉基本语法后,再考虑学习算法。

    这样还有个好处,不如当你遇到某些语言没有 sort 时,你也会想着怎么构造个 sort 方法,而不是这样写判断。
    前期如果为了实现某个功能,用一堆 if else for 来实现,我觉得是没有意义的。
    cstome
        29
    cstome  
       2017-10-24 00:31:57 +08:00
    @cstome PS 我觉得从主流语言的语法的角度,我更建议从 JS 入门编程。
    weiyuzhou
        30
    weiyuzhou  
    OP
       2017-10-24 00:38:04 +08:00
    @cstome 谢谢你的建议,我会参考。先试试看 Java 学不下去就转战 python。
    weiyuzhou
        31
    weiyuzhou  
    OP
       2017-10-24 00:40:08 +08:00
    经过大家的提点我已经我已经重写了代码,虽然仍然很笨拙,但是至少代码结构更加清晰了。不管怎么刚刚入门嘛也是一种解决方法。
    代码现在是这样子:
    ```java
    import java.util.Scanner;

    public class MaxNumber {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Please enter four numbers: ");
    int number1 = input.nextInt();
    int number2 = input.nextInt();
    int number3 = input.nextInt();
    int number4 = input.nextInt();
    int max = 0;
    if (number1 > number2 && number1 > number3 && number1 > number4) {
    max = number1;
    }else if (number2 > number1 && number2 > number3 && number2 > number4) {
    max = number2;
    }else if (number3 > number1 && number3 > number2 && number3 > number4) {
    max = number3;
    }else if (number4 > number1 && number4 > number2 && number4 > number3) {
    max = number4;
    }else {
    System.out.print("有特殊情况!");
    }
    System.out.print(max);
    }
    }
    ```
    mario85
        32
    mario85  
       2017-10-24 00:52:12 +08:00 via Android   3
    其实哪用那么麻烦,既然你有四个输入变量、一个用来存最大的变量和 if,那直接冒泡出来就好了:
    /*前面输入 blah blah blah*/
    largest=number1;
    if(number2>largest) largest=number2;
    if(number3>largest) largest=number3;
    if(number4>largest) largest=number4;
    //然后就可以
    System.out.print(largest); //了
    weiyuzhou
        33
    weiyuzhou/strong>  
    OP
       2017-10-24 01:00:52 +08:00
    @mario85 厉害啦...表示智商很受伤 /cry
    mario85
        34
    mario85  
       2017-10-24 01:37:39 +08:00 via Android
    @weiyuzhou 其实楼上的兄弟已经写出来啦,我只是考虑到只学到 if 能看懂,把只用 if 的写法写出来而已
    qwertyegg
        35
    qwertyegg  
       2017-10-24 06:12:06 +08:00
    如果我写的话我会用 Math.max(Math.max(Math.max(number4, number3), number2), number1);

    或者拆一下 Math.max(Math.max(number4, number3), Math.max(number2, number1));
    seognilV2
        36
    seognilV2  
       2017-10-24 08:23:53 +08:00 via Android
    只要对比 N-1 次 小的丢弃(也就是大的存到一个变量里向后传递) 就行了
    就像是冒泡排序(的一部分)
    wxyz
        37
    wxyz  
       2017-10-24 08:50:04 +08:00
    @qwertyegg 很别致
    yongjing
        38
    yongjing  
       2017-10-24 08:51:18 +08:00
    论简洁,自然是我大 JS Math.max(num1,num2,num3,num4)
    oaix
        39
    oaix  
       2017-10-24 09:09:01 +08:00   1
    java 没有那么复杂
    IntStream.of(1, 2, 3, 4).max();
    oaix
        40
    oaix  
       2017-10-24 09:10:04 +08:00
    @oaix 当然你要先升级到 java8...
    leemove
        41
    leemove  
       2017-10-24 09:16:28 +08:00
    人生太长我用 js.
    ```js
    Math.max(num1,num2,num3,num4)
    ```
    vincenth520
        42
    vincenth520  
       2017-10-24 09:18:56 +08:00
    $arr = [1,2,3,4];
    echo max($arr);
    人生苦短,php 也不错
    meepo3927
        43
    meepo3927  
       2017-10-24 09:22:21 +08:00
    if 的用法一般用于控制逻辑分支。

    找出最大值适合用 for 循环来做。

    这个练习就不用深究了噻
    mosliu
        44
    mosliu  
       2017-10-24 09:25:34 +08:00
    定义
    public int bigger(int in1,int in2){
    return in1>in2?in1:in2
    }

    然后调用
    System.out.println(bigger(bigger(num1,num2),bigger(num3,num4)));
    Makcy
        45
    Makcy  
       2017-10-24 09:29:19 +08:00
    [2,1,3].sort[-1] ruby 也不错 :)
    zgx030030
        46
    zgx030030  
       2017-10-24 09:37:52 +08:00
    就是冒一次泡,循环判断一次。
    denano
        47
    denano  
       2017-10-24 09:51:07 +08:00
    lz 你也说了做完了 3 个数里找最大值,想试试从 4 个数里找最大值。那再进一步,是不是就是从 n 个数里找最大值呢?如果沿用你现在的思路,需要写多少行代码,穷举多少种情况才能完成?
    qiuyk
        48
    qiuyk  
       2017-10-24 10:13:03 +08:00
    @denano 然后楼主成功掌握手动展开决策树的精髓 233333
    lneoi
        49
    lneoi  
       2017-10-24 10:32:47 +08:00
    运行正确就正确了呗。语法还没看完就继续看语法,不碍事。
    然后回头再来改成 N 个数找最大值
    fortunezhang
        50
    fortunezhang  
       2017-10-24 10:44:17 +08:00
    ```
    def maxNum(a,b):
    return a > b ? a: b

    max = maxNum(maxNum(number1,number2),maxNum(number3,number4))
    ```
    weiyuzhou
        51
    weiyuzhou  
    OP
       2017-10-24 13:50:13 +08:00 via Android
    想不到我的帖子会这么火!惭愧,真应该早点学习编程~感谢大家!
    ppwangs
        52
    ppwangs  
       2017-10-24 17:57:42 +08:00
    冒泡,二分。
    ThinkCat
        53
    ThinkCat  
       2017-10-24 18:42:53 +08:00
    多看看 java8,可以这样:

    int max = Stream.of(number1,number2,number3,number4).reduce((a, b) -> a>b?a:b).get();
    poorcai
        54
    poorcai  
       2017-10-25 08:44:11 +08:00
    顺带学习了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3367 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:08 PVG 08:08 LAX 17:08 JFK 20:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86