簡體   English   中英

如何在分形序列中找到第N個數字?

[英]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' == kx'是整數),那就是答案。 否則,答案是n - k*(k+1)/2

示例性實現:

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)

參考: https//en.wikipedia.org/wiki/Arithmetic_progression

使用循環的解決方案。 它將在第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM