大数加法
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
Sample Output
题解:
#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;
}
题目:
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;
}
相关文章推荐
- noj1011 大数加法 思路分析
- 杭电ACM 1753 大明A+B(大数:正小数加法)
- C++大数运算之加法,减法
- 大数加法
- 51nod_1005 大数加法
- 大数加法的字符串实现
- 大数——大数加法
- [ACM Steps] Hat's Fibonacci 大数加法 另一种节约空间的方法
- 大数加法
- 51nod 1005 大数加法
- HDOJ1002 A + B Problem II(大数加法)
- 【hdoj 1002】大数加法
- Integer Inquiry 大数加法
- 杭电水题 1002 大数加法
- 大数加法
- HDU__1002A + B Problem II(大数加法)
- C语言学习趣事_之_大数运算_加法
- 大数加法以及大数乘法
- 大数加法
- 九度OJ 1137:浮点数加法 (大数运算)