大数相加
代码1:
#include <iostream>
#include <string>
using namespace std;
string add(string a,string b)
{
string max,min;
int i,r,la,lb;
max=a; min=b;
if(a.length()<b.length())
{
max=b;
min=a;
}
la=max.size();
lb=min.size();
r=la-1;
for(i=lb-1;i>=0;i--,r--) max[r]+=min[i]-'0';
for(i=la-1;i>0;i--)
{
if(max[i]>'9')
{
max[i]-=10;
max[i-1]++;
}
}
if(max[0]>'9') {max[0]-=10;max='1'+max;}
return max;
}
int main()
{
int n;
int i;
string str[1005];
str[0]="1";
str[1]="1";
str[2]="2";
str[3]="4";
for(i=4;i<1005;i++)
str[i]=add(add(str[i-1],str[i-2]),str[i-4]);
while(cin>>n)
{
cout<<str[n]<<endl;
}
return 0;
}
代码2:
#include<stdio.h>
#define m 100000000
int main()
{
int n,i,j;
int a[1001][51]={0};
a[0][0]=1;
a[1][0]=1;
a[2][0]=2;
a[3][0]=4;
for(i=4;i<1001;i++){
for(j=0;j<51;j++)
a[i][j]=a[i-1][j]+a[i-2][j]+a[i-4][j];
for(j=0;j<50;j++){
if(a[i][j]>m){
a[i][j+1]+=a[i][j]/m;
a[i][j]%=m;
}
}
}
while(scanf("%d",&n)!=EOF)
{
for(i=50;i>0;i--)
if(a[n][i]!=0) break;
printf("%d",a[n][i]);
for(j=i-1;j>=0;j--)
printf("%08d",a[n][j]);
printf("\n");
}
return 0;
}