您的位置:首页 > 其它

大数加法

2015-03-13 20:34 288 查看
有关大数加法的一道题:

题目:

Description

Fibonacci数列,定义如下:

f(1)=f(2)=1

f(n)=f(n-1)+f(n-2) n>=3。

计算第n项Fibonacci数值。

Input

输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。

Output

输出为N行,每行为对应的f(Pi)。

Sample Input

5
1
2
3
4
5


Sample Output

1
1
2
3
5


题解:

#include<stdio.h>

#include<string.h>

int main()

{

int a[1000][250],i,j,n,m,k;

memset(a[0],0,sizeof(a[0]));

memset(a[1],0,sizeof(a[1]));

a[0][0]=a[1][0]=1;

for(i=2;i<1000;i++)

{

memset(a[i],0,sizeof(a[i]));

for(j=0;j<250;j++)

{

a[i][j]+=a[i-1][j]+a[i-2][j];

if(a[i][j]>=10)

{

a[i][j]%=10;

a[i][j+1]+=1;

}

}

}

while(~scanf("%d",&n))

{

while(n--)

{

scanf("%d",&m);

k=0;

for(i=249;i>=0;i--)

{

if(a[m-1][i]!=0)

{

k++;

}

if(a[m-1][i]==0&&k==0)

{

continue;

}

printf("%d",a[m-1][i]);

}

printf("\n");

}

}

return 0;

}

大数加法模板:

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int main()

{

char ch[2010],s[2010];

char rch[2010],rs[2010];//又开了一个数组做处理用,这样比较清晰,而且有输出要求的时候也很方便

int a[2010];

int i,j;

while(~scanf("%s%s%*c",ch,s))

{

memset(a,0,sizeof(a));

memset(rch,0,sizeof(rch));

memset(rs,0,sizeof(rs));

for(i=0; i<strlen(ch); i++)

{

rch[i]=ch[strlen(ch)-i-1]-'0';

}

for(i=0; i<strlen(s); i++)

{

rs[i]=s[strlen(s)-i-1]-'0';

}

for(i=0; i<max(strlen(ch),strlen(s)); i++)

{

a[i]+=rch[i]+rs[i];//忽略了a[i]后面的加号,导致错了很多次都找不到原因,很重要的一点,如过不加加号,上一次加和的结果就没有保留下来,每次都清零

if(a[i]>=10)

{

a[i]%=10;

a[i+1]+=1;

}//如果0+0的情况,按a[i]=(rch[i]+rs[i])%10,a[i+1]+=(rch[i]+rs[i])/10;就会出现0/10的情况,这是错的

}

if(a[i]!=0)

{

i++;

}

int k;

for(j=i-1,k=0; j>=0; j--)

{

if(a[j]==0) k++;

}

if(k==i)

{

printf("0\n");

continue;

}

for(j=i-1,k=0; j>=0; j--)

{

if(a[j]!=0)

{

k++;

}

if(k==0&&a[j]==0) continue;

printf("%d",a[j]);

}

printf("\n");

memset(ch,0,sizeof(ch));

memset(s,0,sizeof(s));//最后记住也还是要清空输入的两个数组

}

return 0;

}

//#include<stdio.h>

//#include<string.h>

//int main()

//{

// char a[50];

// memset(a,'1',sizeof(a));

// while(~scanf("%s",a))

// {

// printf("%c%c%c%c%c\n",a[0],a[10],a[23],a[34],a[45]);

// memset(a,'1',sizeof(a));

// }

// return 0;

//}

//这段代码说明用memset初始化数组,接着再输入数组,没有输入的元素会保持原来memset初始化的

//状态

杭电1002大数加法模板题:

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int main()

{

char ch[2010],s[2010];

char rch[2010],rs[2010];

int a[2010];

int i,j,t,l;

while(~scanf("%d",&t))

{

for(l=0; l<t; l++)

{

scanf("%s%s%*c",ch,s);

printf("Case %d:\n",l+1);

printf("%s + %s = ",ch,s);

memset(a,0,sizeof(a));

memset(rch,0,sizeof(rch));

memset(rs,0,sizeof(rs));

for(i=0; i<strlen(ch); i++)

{

rch[i]=ch[strlen(ch)-i-1]-'0';

}

for(i=0; i<strlen(s); i++)

{

rs[i]=s[strlen(s)-i-1]-'0';

}

for(i=0; i<max(strlen(ch),strlen(s)); i++)

{

a[i]+=rch[i]+rs[i];

if(a[i]>=10)

{

a[i]%=10;

a[i+1]+=1;

}

}

if(a[i]!=0)

{

i++;

}

int k;

for(j=i-1,k=0; j>=0; j--)

{

if(a[j]==0) k++;

}

if(k==i)

{

printf("0\n");

if(l!=t-1)

{

printf("\n");

}

continue;

}

for(j=i-1,k=0; j>=0; j--)

{

if(a[j]!=0)

{

k++;

}

if(k==0&&a[j]==0) continue;

printf("%d",a[j]);

}

printf("\n");

if(l!=t-1)

{

printf("\n");

}

memset(ch,0,sizeof(ch));

memset(s,0,sizeof(s));

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: