Hdu 1029 Ignatius and the Princess IV

本文介绍了一种使用C语言实现的大数运算方法来计算卡特兰数。通过数组存储大数,并实现乘法和除法操作,使得程序能够计算出较大的卡特兰数。

卡特兰数的模拟。

CODE:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;

#define MAX 101
#define BASE 10000
int a[101][MAX];

void multiple(int a[], int size, int b)
{
    int i, j;
    int carry = 0;
    for(i = size-1; i >= 0; i--)
    {
        carry += a[i]*b;
        a[i] = carry%BASE;
        carry = carry/BASE;
    }
    return ;
}

void divide(int a[], int size, int b)
{
    int i, j;
    int div = 0;
    for(i = 0; i < size; i++)
    {
        div = div*BASE + a[i];
        a[i] = div/b;
        div = div%b;
    }
    return
}



void init()
{
    int i;
    memset(a, 0sizeof(a));         //数组高位存放大数低位 
    a[1][MAX-1] = 1;
    for(i = 2; i < 101 ; i++)
    {
        memcpy(a[i], a[i-1], sizeof(a[i-1]));    //h(n) = h(n-1)
        multiple(a[i], MAX, 4*i-2);              // h(n) = h(n-1)*(4*n-2)
        divide(a[i], MAX, i+1);                     //h(n) = h(n-1)*(4*n-2)/(n+1)
    }
    return ;
}



void output(int n)
{
    int i;
    for(i = 0; a[n][i] == 0; i++);     //跳过数组前面的0 
    printf("%d", a[n][i++]);           //输出第一位非0数 
    for(; i < MAX; i++)
    {
        printf("%04d", a[n][i]);       //由于进位是10000,所以每位保持4位长度 
    }
    printf("\n");
}

int main()
{
    int n;
    init();
    while(~scanf("%d", &n))
    {
        output(n);
    }
    return 0;

} 

转载于:https://www.cnblogs.com/g0feng/archive/2012/07/22/2603828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值