在这个问题上,我们给了一个数字num。我们的任务是查找给定数字是否为前n个自然数的总和。
问题描述: 在这里,我们需要检查给定的数字是否为前n个自然数的总和。
输入: num = 55
输出: 是,10
解释:
55是前10个自然数的总和,即1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10。
解决方法:
解决问题的一种简单方法是找到n个自然数之和,直到等于或大于num。
如果总和等于num,则返回n。
如果n的任何值的总和变得大于n,则返回-1。
#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<<"该值是第一个值的总和 "<<n<<" natural numbers"; return 0; }
该值是第一个值的总和 10 natural numbers
这种方法很好,但是我们可以使用数学公式来计算n个自然数之和,从而更有效地解决问题。
第一个共同数字的总和由公式给出,
总和= n *(n + 1)/ 2
给定总和,我们需要找到n的值,
因此,我们需要创建一个二次方程式来找到n。
=> 2 *总和= n 2 + n
=> n 2 + 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<<"该值是第一个值的总和 "<<n<<" natural numbers"; return 0; }输出结果
该值是第一个值的总和 10 natural numbers