第二节:大数加法
使用题型范围:去掉之前的前导0,位数不超过100位,且不存在负数
思路:看注释吧,懒得敲了
#include<stdio.h>
#include<string.h>
int num1[10001];
int num2[10001];
char n1[10001];
char n2[10001];
void gps(char n[])//定位处理字符串
{
int len=strlen(n);
int j=len;
for(int i=0; i<len; i++)//定位大数的小数点的位置
if(n[i]=='.')
j=i;
for(int i=j-1,k=0; i>=0; i--)//标记大数的整数部分
num1[k++]+=n[i]-'0';
for(int i=j+1,k=0; i<len; i++)//标记大数的小数部分
num2[k++]+=n[i]-'0';
}
int add()//计算
{
int flag2=0;
int j=0,end1=0,end2=0;
for(int i=10000; i>=0; i--) //计算大数的小数部分,对齐十分位开始
{
num2[i]+=j;
j=num2[i]/10;
num2[i]%=10;
if(num2[i]!=0&&flag2==0)
{
end2=i;
flag2=1;
}
}
for(int i=0; i<10000; i++) //计算大数的整数部分:对齐个位数开始
{
num1[i]+=j;
j=num1[i]/10;
num1[i]%=10;
if(num1[i]!=0)
end1=i;
}
if(j!=0)//小数的进位处理
{
num1[10000]+=j;
end1=10000;
}
for(int i=end1; i>=0; i--) //输出整数
printf("%d",num1[i]);
if(flag2==1)//如果存在小数部分,输出小数部分
{
printf(".");
for(int i=0; i<=end2; i++)
printf("%d",num2[i]);
}
printf("\n");
}
int main()
{
while(scanf("%s %s",n1,n2)!=EOF)
{
memset(num1,0,sizeof(num1));//初始化储存数组
memset(num2,0,sizeof(num2));
gps(n1);
gps(n2);
add();
}
return 0;
}