在C++中判断给定数字是否为前n个自然数之和
在这个问题中,我们给定一个数字num。我们的任务是判断给定数字是否为前n个自然数之和。
问题描述:我们需要检查给定的数字是否为前n个自然数之和。
让我们来看一个例子来理解这个问题:
输入:num = 55
输出:yes, 10
解释
55 是前 10 个自然数的和,1+2+3+4+5+6+7+8+9+10。
解决方案:
解决这个问题的一个简单方法是找到n个自然数的和,直到它等于或大于num。
如果和等于num,则返回n。
如果在任何n值下,和大于num,则返回-1。
程序说明了我们解决方案的工作原理:
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
示例
#include <iostream> using namespace std; int isNatSum(int num){ int sum = 0; for (int n = 1; sum < num; n++) { sum += n; if (sum == num) return n; } return -1; } int main(){ int num = 55; int n = isNatSum(num); if(n == -1) cout<<"The value is not sum of natural numbers"; else cout<<"The value is a sum of first "<<n<<" natural numbers"; return 0; }
输出 -
The value is a sum of first 10 natural numbers
这种方法很好,但是我们可以使用n个自然数和的数学公式更有效地解决这个问题。
前n个自然数的和由公式给出:
sum = n*(n+1)/ 2
我们已知sum,需要找到n的值,
所以我们需要建立一个二次方程来求n。
=> 2*Sum = n2 + n
=> n2 + n - 2*sum = 0 ,二次方程
这个二次方程的解是:
程序说明了我们解决方案的工作原理:
示例
#include <iostream> #include <math.h> using namespace std; int isNatSum(int num){ int n = ( -1+ sqrt (1 + (8*num) ))/2; if(ceil(n)==floor(n)){ return n; } return -1; } int main(){ int num = 55; int n = isNatSum(num); if(n == -1) cout<<"The value is not sum of natural numbers"; else cout<<"The value is a sum of first "<<n<<" natural numbers"; return 0; }
输出
The value is a sum of first 10 natural numbers
广告