一個平方金字塔數是指自然數的平方和。自然數包括從1到無窮大的所有數字。例如,前4個平方金字塔數分別為1、5、14、30。
為了更好地理解,請考慮以下事實:如果我們以一開始的平方金字塔數為基礎,將數字球堆疊在降序中,它們會形成一個金字塔。
給定一個數Sum。如果Sum是前n個自然數的平方和,則回傳n,否則回傳false。
Input = 30 Output = 4
Explanation = 30是前4個自然數的平方和。
1*1 + 2*2 + 3*3 +4*4 = 30.
因此,輸出應該是4。
Input = 54 Output = -1
Explanation = 沒有任何n個自然數的平方和等於54。因此,輸出應該是-1。
這個問題有兩個解決方案。
暴力破解方法是從n = 1開始。建立一個變數'total',將下一個自然數的平方加到total的前一個值。如果total等於Sum,則傳回n,否則,如果total大於Sum,則傳回false。
start n =1 While (total < sum ): Total += n*n n=n+1 if(total == sum) : Return n Else: Return false end
下面是一個C 程序,用於檢查給定的數字是否是自然數的平方數總和。
#include <iostream> using namespace std; // This function returns n if the sum of squares of first // n natural numbers is equal to the given sum // Else it returns -1 int square_pyramidal_number(int sum) { // initialize total int total = 0; // Return -1 if Sum is <= 0 if(sum <= 0){ return -1; } // Adding squares of the numbers starting from 1 int n = 0; while ( total < sum){ n++; total += n * n; } // If total becomes equal to sum return n if (total == sum) return n; return -1; } int main(){ int S = 30; int n = square_pyramidal_number(S); cout<< "Number of Square Pyramidal Numbers whose sum is 30: "<< endl; (n) ? cout << n : cout << "-1"; return 0; }
Number of Square Pyramidal Numbers whose sum is 30: 4
時間複雜度 - O(sum),其中sum是給定的輸入。
空間複雜度 - O(1):沒有使用額外的空間。
另一種方法是牛頓拉夫遜法。 牛頓拉夫遜法 用來找出給定函數 f(x) 的根和一個根的初始猜測。
sum of squares of first n natural numbers = n * (n + 1) * (2*n + 1) / 6, n * (n + 1) * (2*n + 1) / 6 = sum or k * (k + 1) * (2*k + 1) – 6*sum = 0
所以n是這個三次方程式的根,可以使用牛頓-拉弗森方法來計算,該方法涉及從初始猜測值x0開始,使用下面的公式來找到下一個值x,即從先前的值xn得到的xn 1。
$$\mathrm{x_{1}=x_{0}-\frac{f(x_{0})}{f^{'}(x_{0})}}$$
Start calculate func(x) and derivativeFunction(x) for given initial x Compute h: h = func(x) / derivFunc(x) While h is greater than allowed error ε h = func(x) / derivFunc(x) x = x – h If (x is an integer): return x Else: return -1; end
下面是一個C 程序,用於檢查一個給定的數字是否是自然數的平方和。
#include<bits/stdc++.h> #define EPSILON 0.001 using namespace std; // According to Newton Raphson Method The function is // k * (k + 1) * (2*k + 1) – 6*sum or 2*k*k*k + 3*k*k + k - 6*sum double func(double k, int sum){ return 2*k*k*k + 3*k*k + k - 6*sum; } // Derivative of the above function is 6*k*k + 6*k + 1 double derivativeFunction(double k){ return 6*k*k + 6*k + 1; } // Function to check if double is an integer or not bool isInteger(double N){ int X = N; double temp2 = N - X; if (temp2*10 >=1 ) { return false; } return true; } // Function that finds the root of k * (k + 1) * (2*k + 1) – 6*sum int newtonRaphson(double k, int sum){ double h = func(k, sum) / derivativeFunction(k); while (abs(h) >= EPSILON){ h = func(k, sum)/derivativeFunction(k); // k(i+1) = k(i) - f(k) / f'(k) k = k - h; } if (isInteger(k)) { return (int)k; } else { return -1; } } // Driver program int main(){ double x0 = 1; // Initial values assumed int sum = 91; int n = newtonRaphson(x0,sum); cout<< "Number of Square Pyramidal Numbers whose sum is 91: "<< endl; (n) ? cout << n : cout << "-1"; return 0; }
Number of Square Pyramidal Numbers whose sum is 91: 6
Time Complexity - O((log n) F(n)) where F(n) is the cost of calculating f(x)/f'(x), with n-digit precision.
空間複雜度 - O(1):沒有使用額外的空間。
本文解決了找到給定和的平方金字塔數的問題。我們介紹了兩種方法:一種是蠻力方法,另一種是高效方法。這兩種方法都提供了C 程式。
以上是平方金字塔數(平方和)的詳細內容。更多資訊請關注PHP中文網其他相關文章!