[英]How to find the Nth number in a fractal sequence?
分配是編寫一個C ++程序,它取輸入數n並輸出序列中的第n個數字:
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 ...
這是我到目前為止所提出的:
#include <iostream>
using namespace std;
int main()
{
long long n,k=1,result;
cin >> n;
if(n==1){
result=1;
}else{
for(int i=1,j=1;;i=j,j=j+k){
if(n>i&&n<=j){
result=n-i;
break;
}else{
k++;
}
}
}
cout << result << endl;
}
這也是我之前寫過的:
#include <iostream>
using namespace std;
int main()
{
long long n,count=0,result;
cin >> n;
for(int i=1;;i++){
for(int j=1;j<=i;j++){
count=count+1;
if(count==n){
result=j;
break;
}
}
if(count>=n){
break;
}
}
cout << result << endl;
}
這兩個都適用於較小的數字,但問題是我必須遵循約束:
1 <= n <= 10 ^ 12
因此,當輸入更大的數字時,程序都需要太長時間來輸出解決方案並超過時間限制,即2秒。 我現在已經工作了5個小時,我不知道如何改進這些程序,因此它們更快。 我還考慮過某個公式可以幫助確定這樣一個序列中的第n個數字,但我似乎無法在互聯網或數學書籍中找到任何關於它的信息。 有人能指出我的解決方案嗎? 我會很感激。
我們可以按順序對數字進行分組:
(1) (1, 2) (1, 2, 3) ...
總數量是
1 + 2 + 3 + ...
后者是算術級數,其和等於x*(x+1)/2
。
我們將在序列中找到n+1
個數之前的完整組k
數量。 k
等於最大整數,使得k*(k+1)/2 <= n
。 為了找到它,我們將解決二次方程:
x*(x+1)/2 = n
x^2 + x - 2*n = 0
讓我們假設這個方程的正根是x'
。 我們將其向下舍入到最接近的整數k
。 如果x' == k
( x'
是整數),那就是答案。 否則,答案是n - k*(k+1)/2
。
示例性c ++實現:
double d = 1 + 8.0 * n;
double x = (-1 + sqrt(d)) / 2;
long long k = floor(x);
long long m = k*(k+1) / 2;
if (m == n) {
return k;
} else {
return n - m;
}
該解決方案具有O(1)
時間復雜度。
第一項工作是寫出如下序列:
1
2 3
4 5 6
7 8 9 10
請注意,我們要將此映射到
1
1 2
1 2 3
1 2 3 4
通過重新排列算術級數的公式,求解結果二次,丟棄負根,並刪除答案的任何小數部分,給出數字的行位置。 數字t出現在由整數部分給出的行r中
r = R(1/2 +(1/4 + 2 *(t - 1)) 1/2 )
其中R()是一個向下舍入數字到整數的函數。
但你是在專欄c之后 。 這是從t中減去該行中第一項的值:
c = t - 1/2 * r *(r - 1)
使用循環的解決方案。 它將在第n個數字輸出。
x = 0 ;
i = 1 ;
do {
x += i ;
if( x == n ) {
cout<< i ;
break ;
}
else if( x > n ) {
cout<< (n - (x-i)) ;
break ;
}
i ++ ;
}while( 1) ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.