C ++中N以下两个数字的倍数之和
在此问题中,我们给出了三个整数M1,M2和N。我们的任务是创建一个程序,以查找N以下两个数字的倍数之和。
在这里,我们将添加N以下所有元素,它们是M1或M2的倍数
让我们举个例子来了解这个问题,
输入值
N = 13, M1 = 4, M2 = 6
输出结果
20
说明-4和6的倍数小于13的数字是4、6、8、12。
一个简单的解决方案是从1到N循环并添加所有可以除以M1或M2的值。
算法
步骤1-sum=0,i=0。从i=1循环到N。
步骤1.1-如果(i%M1==0)或(i%M2==0),求和+=i
步骤2-返回总和。
示例
该程序说明了我们解决方案的工作原理,
#include <iostream< using namespace std; int calcMulSum(int N, int M1, int M2){ int sum = 0; for (int i = 0; i < N; i++) if (i%M1 == 0 || i%M2 == 0) sum += i; return sum; } int main(){ int N = 24, M1 = 4, M2 = 7; cout<<"The sum of multiples of "<<M1<<" and "<<M2<<" below "<<N<<" is "<<calcMulSum(N, M1, M2); return 0; }
输出结果
The sum of multiples of 4 and 7 below 24 is 102
这不是解决我们问题的最佳方法,因为它需要O(n)的时间复杂度。
更好的解决方案是对序列的总和使用数学公式。
在这里,我们将使用公式作为系列的总和。最终总和为(M1的倍数+M2的倍数-M1*M2的倍数)
x至n个项的倍数之和由下式给出:
Sum(X) = (n * (1+n) * X)/2
让我们计算总和
sum = ( ( ((n/M1)*(1+(n/M1))*M1)/2) + ((n/M2)*(1+(n/M2))*M2)/2 ) - ((n/M1*M2)*(1+(n/M1*M2))*M1*M2)/2 ) )
示例
用于说明解决方案的程序,
#include <iostream> using namespace std; int calcMulSum(int N, int M1, int M2){ N--; return (((N/M1) * (1 + (N/M1)) * M1 / 2) + ((N/M2) * (1 + (N/M2)) * M2 / 2) - ((N/(M1*M2)) * (1 + (N/(M1*M2))) * (M1*M2) / 2)); } int main(){ int N = 24, M1 = 4, M2 = 7; cout<<"The sum of multiples of "<<M1<<" and "<<M2<<" below "<<N<<" is "<<calcMulSum(N, M1, M2); return 0; }
输出结果
The sum of multiples of 4 and 7 below 24 is 102