能被 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
第二种方法更好,因为它不使用任何循环,这意味着时间复杂度更好。但是,如果输入案例较小,则也可以使用第一种方法。但是对于大型输入案例,第二种方法并非最佳选择。
广告