能被 X 或 Y 整除的前 N 個自然數之和


將所有小於等於 n 的自然數中能被 X 或 Y 整除的數加起來,就是選擇所有能被 X 或 Y 整除的數,並將它們加到一個儲存和的變數中。

要找到前 N 個能被 X 或 Y 整除的自然數之和,有兩種方法:

  • 使用迴圈和條件語句
  • 使用公式

方法一:使用迴圈和條件語句

此方法使用一個迴圈,迴圈計數到 n 個數,選擇能被 X 或 Y 整除的數,並將它們加起來,並在每次迭代時儲存到變數中。

示例程式碼

 線上演示

#include <stdio.h>
int main(void) {
   int n = 54;
   int x = 2 ;
   int y = 5;
   int sum = 0;
   for(int i = 0; i<= n; i++) {
      if(i%x == 0 || i% y == 0)
         sum = sum + i;
   }
   printf("sum of %d natural numbers divisible by %d and %d is %d" ,n,x,y,sum);
   return 0;
}

輸出

sum of 54 natural numbers divisible by 2 and 5 is 881

方法二:使用公式

此方法使用公式來查詢能被一個數整除的前 n 個數之和。

可以使用以下公式:SN/X = ((N/X)/2) * (2 * X + (N/X - 1) * X)

使用此公式,可以找到能被 x 整除的 n 個自然數之和:Sn/x = ((n/x)/2) * (2 * x + (n/x - 1) * x)

使用此公式,可以找到能被 y 整除的 n 個自然數之和:Sn/y = ((n/y)/2) * (2 * y + (n/y - 1) * y)

現在,使用此公式可以找到能被 x 和 y 整除的 n 個自然數之和:Sn/(x*y) = ((n/(x*y))/2) * (2 * (x*y) + (n/(x*y) - 1) * (x*y))

現在,我們將 x 的和與 y 的和相加,再減去 x*y 的和(因為 x*y 的和被加了兩次)。

示例程式碼

 線上演示

#include <stdio.h>
int main() {
   int n = 54;
   int x = 2, y = 5;
   int Sx, Sy, Sxy, sum;
   Sx = ((n / x)) * (2 * x + (n / x - 1) * x) / 2;
   Sy = ((n / y)) * (2 * y + (n / y - 1) * y) / 2;
   Sxy= ((n / (x * y))) * (2 * (x * y) + (n / (x * y) - 1) * (x * y))/ 2;
   sum = Sx + Sy - Sxy;
   printf("sum of %d natural numbers divisible by %d and %d is %d" ,n,x,y,sum);
   return 0;
}

輸出

sum of 54 natural numbers divisible by 2 and 5 is 881

第二種方法更好,因為它不使用任何迴圈,這意味著時間複雜度更好。但是,如果輸入案例較小,則也可以使用第一種方法。但是對於大型輸入案例,第二種方法並非最佳選擇。

更新於:2019年7月30日

瀏覽量:593

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.