很长的数字。师

时间:2011-01-16 10:07:38

标签: c++ catalan

世界! 我有个问题。今天我尝试创建一个代码,找到加泰罗尼亚语的数字。但在我的程序中可以是长数字。我找到了分子和分母。但我不能分数长!此外,此程序中只能使用标准库。请帮帮我。 这是我的代码

#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;
}

P.S。抱歉我的英文不好=)

2 个答案:

答案 0 :(得分:4)

你不必计算(2n)!为了计算(2n)!/(n!(n + 1)!)),因为你可以使用this link中给出的递归关系:

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

这只使用32位算术为您提供前15个术语。并且您可以通过使用16位整数的任意长度整数的乘法和除法来生成多达16384项。这比一般的任意精度算法容易得多,并且很可能被设置为家庭作业。

答案 1 :(得分:1)

在你的长数表示中实现除法是非常困难的,但它是真实的。在我看来,最简单的方法是Long_division