现在的位置: 首页 > 综合 > 正文

POJ 1405 Heritage

2013年12月21日 ⁄ 综合 ⁄ 共 969字 ⁄ 字号 评论关闭

递推式a[i+1]=a[i]*(a[i]+1)  输出的是a[i]+1

要用高精度,最后答案在5.2w位左右。

#include <iostream>
#include <string.h>
using namespace std;
#define DIGIT	4
#define DEPTH	10000
#define MAX     15000
typedef int bignum_t[MAX+1];

void write(const bignum_t a,ostream& os=cout){
	int i,j;
	for (os<<a[i=a[0]],i--;i;i--)
		for (j=DEPTH/10;j;j/=10)
			os<<a[i]/j%10;
}
void add(bignum_t a,const int b){
	int i=1;
	for (a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++);
	for (;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
}
void mul(bignum_t c,const bignum_t a,const bignum_t b){
	int i,j;
	memset((void*)c,0,sizeof(bignum_t));
	for (c[0]=a[0]+b[0]-1,i=1;i<=a[0];i++)
		for (j=1;j<=b[0];j++)
			if ((c[i+j-1]+=a[i]*b[j])>=DEPTH)
				c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH;
	for (c[0]+=(c[c[0]+1]>0);!c[c[0]]&&c[0]>1;c[0]--);
}

bignum_t a[20],tmp;
int main(){
    int n,i,j;
    double left;
    cin>>n;
    a[1][0]=1;
    a[1][1]=2;
    left=0.5;
    cout<<"2\n";
    for (i=2;i<=n;i++){
        memcpy(tmp,a[i-1],sizeof(tmp));
        add(tmp,1);
        write(tmp);cout<<endl;
        if (i<n) mul(a[i],a[i-1],tmp);
        //a[i]=a[i-1]*(a[i-1]+1);
    }
}

 

抱歉!评论已关闭.