1

世界!私は問題があります。今日は、カタロニア語の数字を見つけるコードを作成しようとしました。しかし、私のプログラムでは長い数字になる可能性があります。分子と分母を見つけました。しかし、長い数字を分割することはできません! また、このプログラムでは標準ライブラリのみを使用する必要がありました。お願い助けて。これは私のコードです

#include <vector>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    const int base = 1000*1000*1000;
    vector <int> a, b;
    int n, carry = 0;
    cin>>n;
    a.push_back(n);                     
    for (int ii=n+2; ii!=(2*n)+1;++ii) { 
        carry = 0;                      
        for (size_t i=0; i<a.size() || carry; ++i) {
            if (i == a.size())
                a.push_back (0);
            long long cur = carry + a[i] * 1ll * ii;
            a[i] = int (cur % base);
            carry = int (cur / base);
        }
    }
    while (a.size() > 1 && a.back() == 0) a.pop_back();

    b.push_back(n);                
    for (int ii=1; ii!=n+1;++ii) {
        carry = 0;
        for (size_t i=0; i<b.size() || carry; ++i) {
            if (i == b.size())
                b.push_back (0);
            long long cur = carry + b[i] * 1ll * ii;
            b[i] = int (cur % base);
            carry = int (cur / base);
        }
    }
    while (b.size() > 1 && b.back() == 0) b.pop_back();

    cout<<(a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i) cout<<(a[i]);

    cout<<"   ";

    cout<<(b.empty() ? 0 : b.back());
    for (int i=(int)b.size()-2; i>=0; --i) cout<<(b[i]);
    //system("PAUSE");
    cout<<endl;
    return 0;
}

PS私の悪い英語で申し訳ありません=)

4

2 に答える 2

4

(2n) を計算する必要はありません。(2n)!/(n!(n+1)!)) を計算するには、このリンクで指定された再帰関係を使用できるためです。

C(0)=1
C(n)=(4n-2)C(n-1)/(n+1)

これにより、32 ビット演算のみを使用して最初の 15 項が得られます。また、任意の長さの整数を 16 ビット整数で乗算および除算するだけで、最大 16384 個の項を生成できます。これは、一般的な任意精度の算術演算よりもはるかに簡単で、宿題として設定することもできます。

于 2011-01-16T11:09:09.517 に答える
1

長い数の表現で除算を実装するのは非常に困難ですが、それは現実です。私の意見では、最も簡単な方法はLong_divisionです。

于 2011-01-16T20:26:48.953 に答える