在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

更新于:2021年1月22日

浏览量:280

开启你的职业生涯

完成课程获得认证

开始学习
广告