在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。

程式說明了我們解決方案的工作原理:

示例

線上演示

#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

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告