【问题标题】:Need help to calculate the sum of numbers by omitting somes of them需要帮助通过省略其中一些来计算数字的总和
【发布时间】:2021-07-10 16:11:42
【问题描述】:

#1。我需要编写一个 Java 程序,计算从 1 到 10,000(包括 1 和 10,000)的数字之和,但忽略可被 3 整除的数字以及百位为 2 或 3 的数字(例如 8200 或 5312)。

我开始但没有工作:

public class Sum10000 {

    public static void main(String[] arg) {
        long i = 0;
        long sum = 0;

        while (i != 10000) {
            sum = sum + i;
            i++;

            if ((i % 3) == 0 || (i >= 200 && i <= 399) || (i >= 1200 && i <= 1399)
                    || (i >= 2200 && i <= 2399) || (i >= 3200 && i <= 3399) || (i >= 4200 && i <= 4399)
                    || (i >= 5200 && i <= 5399) || (i >= 6200 && i <= 6399) || (i >= 7200 && i <= 7399)
                    || (i >= 8200 && i <= 8399) || (i >= 9200 && i <= 9399)) {
                continue;
            }
            System.out.println( i);
            System.out.println(sum);

        }
    }
}

【问题讨论】:

  • “没用”是什么意思?它是否给出错误或不正确的输出?如果是这样,请在您的问题中提供具体细节。

标签: java arraylist operators


【解决方案1】:

您应该只在测试条件后增加总和。

while (i != 10000) {
    i++;
    if ((i % 3) == 0 || (i >= 200 && i <= 399) || (i >= 1200 && i <= 1399) ||
        (i >= 2200 && i <= 2399) || (i >= 3200 && i <= 3399) || (i >= 4200 && i <= 4399) ||
        (i >= 5200 && i <= 5399) || (i >= 6200 && i <= 6399) || (i >= 7200 && i <= 7399) ||
        (i >= 8200 && i <= 8399) || (i >= 9200 && i <= 9399)) {
        continue;
    }
    sum += i;
    System.out.println(i);
    System.out.println(sum);
}

使用Stream 可以简化:

System.out.println(IntStream.rangeClosed(1, 10000)
  .filter(x -> x % 3 != 0 && x / 100 % 10 != 2 && x / 100 % 10 != 3).sum());

【讨论】:

  • 我确实看到了我的错误,谢谢!!对于 Steam 部分,我还没有,但会调查它。看起来很干净。
  • @NoobyOne 很高兴为您提供帮助。
【解决方案2】:

你没有跳过你想要的数字。

首先你的循环需要运行,包括你的最后一个数字,所以你应该检查i&lt;=10000

其次,当您有一个想要跳过的数字时,您实际上需要跳过它,您只是跳过了打印它!而是尝试这样的事情:

public class Sum10000 {

    public static void main(String[] arg) {
        long i = 1;
        long sum = 0;

        while (i != 10000) {
            while ((i % 3) == 0 || (i >= 200 && i <= 399) || (i >= 1200 && i <= 1399)
                    || (i >= 2200 && i <= 2399) || (i >= 3200 && i <= 3399) || (i >= 4200 && i <= 4399)
                    || (i >= 5200 && i <= 5399) || (i >= 6200 && i <= 6399) || (i >= 7200 && i <= 7399)
                    || (i >= 8200 && i <= 8399) || (i >= 9200 && i <= 9399)) {
                i++;
            }

            sum = sum + i;
            System.out.println( i);
            System.out.println(sum);
        }
    }
}

【讨论】:

    【解决方案3】:

    为什么不以编程方式测试您的条件?

    int sum = 0;
    for (int i = 1; i <= 10000; i++) {
        if (i % 3 == 0) {
            System.out.println("Exclude " + i + ": multiple of " + 3);
            continue;
        }
        String decimal = "" + i;
        if (decimal.length() > 2) {
            char dig3 = decimal.charAt(decimal.length() - 3);
            if (dig3 == '2' || dig3 == '3') {
                System.out.println("Exclude " + i + ": 100s digit is " + dig3);
                continue;
            }
        }
        sum += i;
    }
    System.out.println(sum);
    System.out.println("Or formatted: " + NumberFormat.getIntegerInstance().format(sum));
    

    【讨论】:

      【解决方案4】:

      我对这个问题的理解是从总和中省略数字:这就是为什么总和放在continue 指令之后的原因。

      i % 1000可以用来获取i的后三位:

      for (int sum=0, i=1; i<= 10000; ++i) {
          int test = i % 1000;
          
          if ((test >= 200 && test < 400) || i % 3 == 0)
              continue;
      
          sum += i;
          System.out.println("i   = " + i);
          System.out.println("sum = " + sum);
      }
      

      【讨论】:

      • 漂亮干净!
      • 哇,好简单好干净。哇!谢谢!!
      【解决方案5】:

      公共类 Sum10000 {

      public static void main(String[] arg) {
          
          long sum = 0;
      
          for (int i = 1, 1!=10001, i++) {
      
              if (!((i % 3) == 0 || (i >= 200 && i <= 399) || (i >= 1200 && i <= 1399)
                      || (i >= 2200 && i <= 2399) || (i >= 3200 && i <= 3399) || (i >= 4200 && i <= 4399)
                      || (i >= 5200 && i <= 5399) || (i >= 6200 && i <= 6399) || (i >= 7200 && i <= 7399)
                      || (i >= 8200 && i <= 8399) || (i >= 9200 && i <= 9399))) {
      
                  sum = sum + i;
      
              }
          }
              
          System.out.println(sum);
      }
      

      }

      【讨论】:

        【解决方案6】:

        使用正则表达式添加一个替代方案,IMO 比在 while 或 if 块中处理 3 个或更多条件更具可读性:

        public static void main(String[] args) {
            int sum = 0;
            for(int i = 1; i <=10_000; i++){
                String s = String.valueOf(i);
                if( i%3 != 0 && !s.matches(".*[23]..") ){
                    sum += i;
                }
            }
            System.out.println(sum);
        }  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          • 1970-01-01
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多