很早就开始写高精度的加法了 今天来总结一下吧
首先 我用的是字符数组处理的方法 先用字符数组输入 在逆序转入int型的数组 然后进位计算就好了
需要注意的几个细节 1.记得每次循环都需要初始化
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
char a[1010],b[1010];
int x[1010],y[1010];
int t,c[1010];
int i,j,n,add,ret,get;
int sum,casee=0;
scanf("%d",&t);
while(t--)
{
memset(x,0,sizeof(x)); //初始化
memset(y,0,sizeof(y));
memset(c,0,sizeof(c));
scanf("%s %s",&a,&b);
printf("Case %d:\n",++casee);
j=strlen(a);
n=0;
for(i=j-1;i>=0;i--)
{
x[n++]=a[i]-'0';
}
j=strlen(b);
n=0;
for(i=j-1;i>=0;i--)
{
y[n++]=b[i]-'0';
}
add=0;
for(i=0;i<=max(strlen(a),strlen(b))+3;i++)//逆序
{
sum=x[i]+y[i]+add;
add=sum/10;
c[i]=sum%10;
}
ret=0;
for(i=0;i<=max(strlen(a),strlen(b))+3;i++)
{
if(c[i]!=0)
{
ret=1;
break;
}
}
printf("%s + %s = ",&a,&b);
if(ret==0)
printf("0");
else
{
for(i=max(strlen(a),strlen(b))+3;i>=0;i--)
{
if(c[i]!=0)
{
get=i;
break;
}
}
for(i=get;i>=0;i--)
{
printf("%d",c[i]);
}
}
if(t!=0)
printf("\n\n");
else
printf("\n");
}
}1002
还有就是对于数组的中大数的计算
关键点 怎么去处理逆序问题 (oj1297上的大神是直接把初始的值放在最后一位) 其他的思路就和普通的大数加法是一样的了
(!! 对逆序的处理是关键 以后也要灵活处理 ) 逆序是位对齐的一种方式 位对齐在大数乘法 含小数的大数加法中另有体现
附上代码
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int f[1005][1201];
int main()
{
int i,j,add,sum;
memset(f,0,sizeof(f));
f[1][1200]=1;
f[2][1200]=2;
f[3][1200]=4;
f[4][1200]=7;
//printf("111\n");
for(i=5;i<=1000;i++)
{
add=0;
for(j=1200;j>=0;j--)
{
sum=f[i-1][j]+f[i-2][j]+f[i-4][j]+add;
add=sum/10;
f[i][j]=sum%10;
}
}
int n;
while(scanf("%d",&n)>0)
{
for(j=0;j<=1200;j++)
if(f[n][j]!=0)
break;
for(;j<=1200;j++)
printf("%d",f[n][j]);
printf("\n");
}
return 0;
}