【问题标题】:Finding value for ABC为 ABC 寻找价值
【发布时间】:2021-12-02 17:26:34
【问题描述】:
class Main {
  public static void main(String[] args) {
    int abc;
    int total = 1000;
    for (abc = 220000000; abc < 240000000; abc++) {
      String string1 = Integer.toString(abc);
      int a, b, c;
      a = 0;
      b = 0;
      c = 0;
      int a2 = squared(a);
      int b2 = squared(b);
      int c2 = squared(c);
      a = Integer.parseInt(string1.substring(0, 3));
      b = Integer.parseInt(string1.substring(3, 6));
      c = Integer.parseInt(string1.substring(6, 9));
      if (a < b && a < c && b < c && a2 < b2 && b2 < c2 && a + b + c == total) {
        System.out.println("The answer is " + abc);
      } else {
        System.exit(0); // testing
      }
    }
  }

  public static int squared(int x) {
    return (x * x);
  }
}

这是我的代码。我试图让程序打印 abc 的值,以便 a 小于 b,b 小于 c。并且a平方小于b平方,而b平方小于c平方。此外,a+b+c 必须等于 1000。我尝试将 abc 设为一个整数值,并使用子字符串来区分 a、b 和 c。例如 224,356,446。带有子字符串的 An 将使 a=224、b=356 和 c=446。当我运行程序时,没有打印任何内容。由于系统退出,正在调用 else 语句。有人可以帮忙吗?

【问题讨论】:

  • 如果a &lt; b &lt; c 则对于任何正值a^2 &lt; b^2 &lt; c^2 始终为真。另外:如果a&lt;bb&lt;c 然后a&lt;c,所以你只需要3 次检查:if( a&lt;b &amp;&amp; b&lt;c &amp;&amp; a+b+c == total)
  • 为什么在给a, b, c 非零值之前分配a2, b2, c2
  • 至于 if 语句:想一想如果你还没到最后并且还没有找到答案会发生什么:你真的想马上退出吗?我对此表示怀疑,因此继续循环,直到找到答案 - 在这种情况下,您可以使用 break; 退出循环。有了这个,就根本不需要System.exit()
  • 在您弄清楚实际值 a、b 和 c 是什么之前,您正在调用 squared() 来获取平方值。
  • 顺便说一句,您不需要继续构建字符串:c = abc % 1000; b = (abc / 1000) % 1000; a = (abc / 1000000) % 1000;。但是在a &lt; b &lt; c 之前,您将经历很多迭代。对c 进行迭代没有任何意义,只需分配c = total - (a + b);,并相应减少迭代次数。

标签: java for-loop if-statement


【解决方案1】:

您没有打印任何内容,因为您在第一次迭代中没有匹配项。缺少匹配会触发System.exit(0),因此程序无需再次迭代即可退出。

您似乎假设abc 是非负整数,所以我将采用相同的假设。因此,如果a &lt; b &lt; ca^2 &lt; b^2 &lt; c^2,所以我们不必测试后一种情况。

如果a + b + c == 1000a &lt; b &lt; c,那么如果a==0b==1(它们的最小值)那么c == 999。所以我们知道在任何情况下我们都不必迭代超过 999。这个界限可以进一步优化一点,但这样做是没有意义的,因为他的输出操作远远超过了迭代成本。

public static void main(String[] args) {
  int count = 0;
  for (int a = 0 ; a < 999 ; ++a) {
    for (int b = a+1 ; b < 999 ; ++b) { // a < b
      int c = 1000 - a - b;
      if (c <= b) {
        break;
      }
      System.out.printf("%d  %d, %d, %d", ++count, a, b, c).println();
    }
  }
}

【讨论】:

  • 你不需要最里面的循环:只需设置int c = 1000 - a - b;
  • @AndyTurner 你是对的 - 我会修复
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2020-07-08
相关资源
最近更新 更多