在这个问题上,我们给了两个整数m和n。我们的任务是找到前n个自然数的第m个求和。
问题描述: 我们将找到m次n个自然数之和。总和由公式给出,
如果(m> 1),
sum(n, m) = sum(sum(n,(m-1)),1)
如果(m = 1)
sum(n, m) = sum(n,1)= n个自然数的总和
让我们举个例子来了解这个问题,
输入: m = 4,n = 2
输出: 231
解释:
sum(2,4)= sum(sum(2,3),1)
=和(sum(sum(2,2),1),1)
=和(sum(sum(sum(sum(2,1),1),1),1)
=总和(sum(sum(3,1),1),1)
=总和(sum(6,1),1)
=总和(21,1)
= 231
解决此问题的简单方法是使用两个嵌套循环。外部一个用于m个值,内部一个用于n个值。我们将更新n的值,并计算n次自然数的总和m次。
一种更有效的方法是递归调用n个自然数的总和m次,每次进行递归时,用先前的总和更新值。
算法:
步骤1: 如果m的总和大于1,则用sum = sum(n,m-1)*(sum(n,m-1)+1)/ 2更新 总和。
步骤2: 如果m的值为1,则返回和= n *(n + 1)/ 2。
步骤3: 返回总和。
#include <iostream> using namespace std; int calcSumN(int n, int m) { if (m == 1) return (n * (n + 1) / 2); return (calcSumN(n, m-1) * (calcSumN(n, m-1) + 1) / 2); } int main() { int n = 4; int m = 6; cout<<m<<"-th summation of first "<<n<<" 自然数是 "<<calcSumN(n, m); return 0; }输出结果
6-th summation of first 4 自然数是 125230148