【问题标题】:Can a given number be written as a sum of two or more consecutive positive integers?给定的数字可以写成两个或多个连续正整数的和吗?
【发布时间】:2014-10-23 00:12:56
【问题描述】:

我需要编写一个方法,接收 int 并返回 true,如果该数字可以写为两个或多个连续正整数的和,否则返回 false

boolean IsSumOfConsecutiveInts(int num)

我发现所有奇数(除了数字 1)都可以写成 2 个连续正整数之和:

return (num > 1 && num % 2 == 1);

但这并没有考虑到可以写成超过2个连续正整数之和的数字(例如6 == 1 + 2 + 3)。

如何确定一个数字是否可以写成两个或更多个连续正整数的和?

【问题讨论】:

    标签: java number-theory


    【解决方案1】:

    这些号码称为Polite Numbers

    而且,方便的是,唯一礼貌的数字是 2 的幂。

    所以,这给了我们两个选择。我们可以确定一个数字是礼貌的,或者我们可以确定它不是 2 的幂

    我都做了;后者更容易(也更有效)。

    1. 这决定了一个数字是否礼貌

      boolean IsSumOfConsecutiveInts(int num)
      {
          int sumOfFirstIIntegers = 3;
          for (int i = 2; sumOfFirstIIntegers <= num; i++)
          {
              if (i%2 == 0 ? (num%i == i/2) : (num%i == 0))
              {
                  return true;
              }
              sumOfFirstIIntegers += i + 1;
          }
          return false;
      }
      

      这个很难理解。我花了一段时间才想出来。

      基本上,i 是我们正在检查的连续整数的数量;

      sumOfFirstIIntegers等于第一个i整数之和,也就是说所有可以表示为i连续整数之和的数字都大于或等于sumOfFirstIIntegers

      值得讨论的最后一部分是布尔语句i%2 == 0 ? (num%i == i/2) : (num%i == 0)。让我们看一些例子:

      i    all sums of i consecutive positive integers
      2    3, 5, 7, 9...
      3    6, 9, 12, 15...
      4    10, 14, 18, 22...
      5    15, 20, 25, 30...
      

      有两种情况,但无论哪种情况,我们都可以非常简单地表示所有可能的数字,它们是i 连续整数的总和。

      1. i 为偶数时,num 必须等于(i * n) + (i / 2),其中n 是一个非负整数。这当然可以写成num % i == i / 2

      2. i 为奇数时,num 必须等于i * n,其中n 是一个非负整数。这给了我们第二个条件num % i == 0

      除这些条件外,num 不能小于第一个i 正整数之和。因此,我们的for 循环的条件:sumOfFirstIIntegers &lt;= num

    2. 这决定了一个数字是否不是2的幂

      boolean IsSumOfConsecutiveInts(int num)
      {
          return (num & (num - 1)) != 0;
      }
      

      This answer 很好地解释了为什么这样做。

    请注意,上述两种解决方案的结果相同,只是对问题的思考方式不同。

    【讨论】:

    • 在1和2中,x不应该是num吗?您能否也将yi 重命名为更具描述性的名称?
    • @KenY-N 是正确的。虽然,没有理由重命名“i”变量,因为它通常用于“迭代”......因为它处于循环中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2014-03-05
    • 2015-05-07
    相关资源
    最近更新 更多