首頁 > 後端開發 > C++ > 大於p的最小三角數

大於p的最小三角數

王林
發布: 2023-09-20 19:13:02
轉載
1262 人瀏覽過

大於p的最小三角數

我們將討論三角形數以及如何找到僅大於給定數字「​​num」的最小三角形數。我們先討論什麼是三角數,然後找出比「num」大的最小三角數

我們將看到針對相同問題的兩種不同方法。在第一種方法中,我們將執行一個簡單的循環來產生輸出,而在第二種方法中,我們將首先產生一個用於計算所需數字的通用公式,然後直接應用該公式來獲得最小的三角形數。 p>

問題陳述

我們必須找出僅大於「num」的最小三角形數。

我們有多個裝有球的盒子。對於所有盒子來說,盒子包含的球的數量都是一個不同的三角形數字。這些盒子從 1 到 n 編號。我們必須找出從盒子中取出“num”個球後哪個盒子將包含最少數量的球。

讓我們透過一個例子來理解這一點

Input number was: num = 5
登入後複製

我們必須找出取出 5 個球後哪個盒子裡的球數最少

Output:3rd box will contain a minimum of balls after removing 4 balls.
登入後複製

此範例的解決方案 -

Boxes with number of balls: {1 3 6 10 ....}
Box 3 will contain only 1 ball after removing 4 balls from it.
登入後複製

什麼是三角數?

三角形數是可以用等邊三角形網格形式表示的數。一行中的點數總是等於行號,即第一行將包含 1 個點,第二行將包含 2 個點,依此類推。幾個三角形數字是:1、3、6、10、15……。現在讓我們推導出第 n 個三角形數的公式 -

我們知道,三角形數的第n行包含n個點,因此三角形數可以表示為每行中的點總和。我們也知道,第n個三角數有n行,因此第n個三角數可以由前n個自然數和給出。

方法 1:(直接方法)

在這種方法中,我們將運行一個循環併計算給定數字和第n 個三角數之間的差,當我們得到差值>=0 時,我們將獲得所需的盒子編號,因此我們將截斷循環。 < /p>

對於三角數,我們將繼續將 n 與現有的第 (n-1) 個三角數相加,以計算下一個三角數的值。

演算法

  • 第 1 步 - 將變數 triangular_number 初始化為 0。

  • 第 2 步 - 運行 for 迴圈並為每次迭代不斷新增 n。

  • 第 3 步 - 繼續計算三角形數與給定數字「​​num」之間的差。

  • 第 4 步 - 當我們得到差異 >=0 時,我們將列印 n 作為所需的框編號。

範例

這種方法在 C 中的實作如下 -

#include <iostream>
using namespace std;
int main(){
   int num = 1234;
   int triangular_number = 0;
   for (int n=1; triangular_number<=num; n++){
      triangular_number = triangular_number + n;
      if((triangular_number-num)>=0){
         cout<<"The smallest triangular number larger than "<<num<<" is "<<n;
         return 0;
      }
   }
}
登入後複製

輸出

The smallest triangular number larger than 1234 is 50
登入後複製
登入後複製

方法 2:基於公式的方法

在這個方法中,我們首先產生一個計算所需數字的通用公式,然後直接應用該公式來獲得僅大於給定數字的最小三角形數。

第 n 個盒子編號的三角形數由下式給出 -

Triangular number = (n*(n+1))/2
登入後複製

取得最小的盒子編號“n”,使得三角形數>=num。

i.e. (n*(n+1))/2 >= num
登入後複製

這意味著我們必須解決 -

n<sup>2</sup> + n – 2*num >= 0
登入後複製

使用這個方程,我們得到

n = ceil( (sqrt(8*num+1)-1)/2 )
登入後複製

範例

此方法的程式碼由以下給出 -

#include<bits/stdc++.h>
using namespace std;
int boxnum(int num){
   return ceil( ( sqrt( 8*num + 1 ) -1 ) / 2 ) ;
}
int main(){
   int num = 1234 ;
   cout << "The smallest triangular number larger than "<<num<<" is "<<boxnum(num);
   return 0;
}
登入後複製

輸出

The smallest triangular number larger than 1234 is 50
登入後複製
登入後複製

此方法的時間複雜度 - O(logn)

空間複雜度 - O(1),因為我們只使用恆定的額外空間。

在本文中,我們討論了兩種不同的方法來尋找僅大於給定數字「​​num」的最小三角形數。第一種方法只是透過運行循環並為每次迭代添加 n 來計算三角數。我們同時計算了給定數和三角數之間的差。在第二種方法中,我們產生了一個數學公式來計算我們所需的輸出。

以上是大於p的最小三角數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板