V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weiyuzhou
V2EX  ›  程序员

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

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

    门外汉自学入门,刚刚看到 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  
       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
    可以搜搜排序算法看看
    x7395759
        23
    x7395759  
       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  
       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  
    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   ·   实用小工具   ·   932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.