V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
whatCanIDoForYou
V2EX  ›  问与答

突发奇想问一个 Java 的一个小小小问题

  •  
  •   whatCanIDoForYou · 2020-07-20 16:29:12 +08:00 · 1672 次点击
    这是一个创建于 1384 天前的主题,其中的信息可能已经有所发展或是发生改变。
    /**
    *
    * 两个数不能同时为偶数
    * 分母和分子 取值范围在[1-20]
    * @param args
    */
    public static void main(String[] args) {
    for (int i = 1; i <= 20; i++) {
    int first = i;
    for (int j = 1; j <= 20 ; j++) {
    int second = j;
    //如果同时为偶数,则跳出本次循环
    if((first%2 == 0) && (second%2==0) )
    continue;
    System.out.println("首当其冲:"+first +"退而求次:"+ second +",结果等于"+ String.format("%.3f", first / new Double(second)));
    }
    }
    21 条回复    2020-07-20 18:34:48 +08:00
    whatCanIDoForYou
        1
    whatCanIDoForYou  
    OP
       2020-07-20 16:30:06 +08:00
    如果您继续往下读可能浪费你的时间(您理解的),当然非常期待您的回复。
    whatCanIDoForYou
        2
    whatCanIDoForYou  
    OP
       2020-07-20 16:32:09 +08:00
    上面那个方法实现了两个非偶数的判断。但是我突然想 我能不能不写那两句 if 判断,加一些逻辑运算符 在第二个 for 循环去判断。
    如果实现了 我觉得就比较 B 格高 哈哈哈哈
    在尝试。
    也请大家帮忙想下。
    pushback
        3
    pushback  
       2020-07-20 16:36:57 +08:00
    for (int i = 1; i <= 20; i++)
    for (int j = 1; j <= 20; j++)
    if ((i + j) % 2 ==0)
    continue;
    然后怎么优化,细说喃
    whatCanIDoForYou
        4
    whatCanIDoForYou  
    OP
       2020-07-20 16:38:09 +08:00
    @pushback #3 就是没有想好怎么优化,只是突发奇想不想写这两行 判断 能不能在 第二个 for 中 使用 && 解决
    whatCanIDoForYou
        5
    whatCanIDoForYou  
    OP
       2020-07-20 16:39:12 +08:00
    @pushback #3 而且你这个 + 的判断 也不中啊 铁子 两个奇数也跳走了~~
    pushback
        6
    pushback  
       2020-07-20 16:43:08 +08:00
    哦哦,没审题
    Vegetable
        7
    Vegetable  
       2020-07-20 16:43:28 +08:00
    first 是奇数时,第二层循环整个就是浪费的, 不应该在输出前判断。
    其次,你可以直接 for int i=2;i<=20;i+=2 设置步长为 2 跳过奇数。
    最后,在 for 循环当中直接判断好像是不行的,
    whatCanIDoForYou
        8
    whatCanIDoForYou  
    OP
       2020-07-20 16:45:20 +08:00
    @Vegetable #7 可能是我没有表述太清楚哦 抱歉。 不论奇数还是偶数都是要使用的,但是 在使用两个数的时候不能同时为偶数。再次抱歉
    pushback
        9
    pushback  
       2020-07-20 16:45:47 +08:00
    @Vegetable 如果这两个数组是不规则数组,步长也是不能固定的
    remiver
        10
    remiver  
       2020-07-20 16:51:15 +08:00
    ((i | j) & 1) > 0 这种?
    Vegetable
        11
    Vegetable  
       2020-07-20 16:52:23 +08:00
    @whatCanIDoForYou #8 是我没看清楚.
    不能同时为偶数的话,两个数二进制最后一位必须有一个 1,所以 1&(first|second)==1,这个倒是能通过位运算判断
    lllue
        12
    lllue  
       2020-07-20 16:52:34 +08:00   ❤️ 1
    for (int i = 0; i < 20; i++) {
    int first = i+1;
    for (int j = 0; j < 20 ; j=j+1+i%2) {
    int second = j+1;
    //如果同时为偶数,则跳出本次循环
    System.out.println("首当其冲:"+first +"退而求次:"+ second +",结果等于"+ String.format("%.3f", first / new Double(second)));
    }
    }
    pushback
        13
    pushback  
       2020-07-20 16:57:04 +08:00
    // scope 1~20
    int[] moArr = {19, 2, 3, 5, 6, 8, 15, 20, 1};
    int[] deArr = {6, 7, 3, 2, 12, 18, 11, 19, 9};
    for (int i = 0; i < moArr.length; i++) {
    int mo = moArr[i];
    for (int j = 0; j < deArr.length; j++) {
    int de = deArr[j];
    {continue;}
    }
    }
    for 第二段是 end 条件,你要在里面进行 continue,有点骚
    whatCanIDoForYou
        14
    whatCanIDoForYou  
    OP
       2020-07-20 17:10:53 +08:00
    @remiver #10 哈哈哈哈哈 我对于这些奇数还有点懵,我验证了 告诉您

    @Vegetable #11 奇数和奇数 的情况呢 好像没有考虑呦
    @lllue #12 厉害厉害 学习了 谢谢您
    @pushback #13 嘿嘿 这个仅仅是跳过当前不符合条件 下面该干嘛干嘛的。 您这段代码没有实现我的需求哦
    Vegetable
        15
    Vegetable  
       2020-07-20 17:15:57 +08:00
    @whatCanIDoForYou #14 奇数和奇数也是的,两个奇数相当于(1 or 1) and 1,结果也是 1
    pushback
        16
    pushback  
       2020-07-20 17:18:03 +08:00
    @whatCanIDoForYou 没有,我只是重新罗列了一下,上面说按步长的情况在乱序数组里面不适用
    cigarzh
        17
    cigarzh  
       2020-07-20 17:20:41 +08:00
    for (int j = 1; j <= 20 ; j=j+((~(i&1)&j&1)==1?2:1)) {

    初始化的 ij 不能都为偶数
    msg7086
        18
    msg7086  
       2020-07-20 17:25:07 +08:00
    这不是 B 格高,这属于代码混淆,把原本思路清晰的代码改写成一个星期后的自己也看不懂的代码。
    whatCanIDoForYou
        19
    whatCanIDoForYou  
    OP
       2020-07-20 17:31:41 +08:00
    @Vegetable #15 学习力一波 了解了 谢谢您 哈哈哈哈哈哈



    @msg7086 #18 对的,就是 无聊玩一玩 回忆回忆基础的小美好
    superJava
        20
    superJava  
       2020-07-20 18:19:36 +08:00
    public static void main(String[] args) {
    IntStream.range(1, 20).forEach(i -> {
    IntStream.range(1, 20).filter(j -> !(i % 2 == 0 && j % 2 == 0)).forEach(j -> {
    System.out.println("首当其冲:" + i + "退而求次:" + j + ",结果等于" + String.format("%.3f", i / new Double(j)));
    });
    });
    }
    whatCanIDoForYou
        21
    whatCanIDoForYou  
    OP
       2020-07-20 18:34:48 +08:00
    @superJava #20 1.8 新特性 good 谢谢您~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2467 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:39 · PVG 16:39 · LAX 01:39 · JFK 04:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.