1.1 2.9
1.1111111111 2.3444323343
1 1.1
4
3.4555434454
2.1
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,l,len1,len2,flag,sum[1100],p,zb;
char a[1000],b[1000];//把两个加数存分别存放在字符型数组a和b里
while(scanf("%s%s",a,b)!=-1){//输入的两个数字符型
len1=strlen(a);//求出数组a的长度
len2=strlen(b);//求出数组b的长度
memset(sum,0,sizeof(sum));//库函数memeset 将地址sum 开始的sizeof(sum)字节内容置成0
//sizeof(sum)的值就是sum 的长度
//memset 函数在string.h 中声明
k=len1;//把a的长度赋值给K
l=len2;
flag=0;//不含小数点
for(i=0;a[i];i++)
if(a[i]=='.')
break;
k=i+1;//当判断到小数点的时候将小数点在第几位存到k里
if(a[i])//是小数点的时候flag为1
flag=1;
for(j=0;b[j];j++)//同数组a,定义数组b
if(b[j]=='.')
break;
l=j+1;//当判断到小数点的时候将小数点在第几位存到l里
if(b[j])
flag=1;
if(i>j)
{
zb=i+1;//把两数对齐后小数点的位置
}
else
{
zb=j+1;
}
p=zb;//把小数点下标赋值给p
i--;//位数后移
j--;
for(;;i--,j--)//计算小数点之前的部分
{
if(i>=0&&j>=0)//判断两个数是否为0
{sum[p--]=a[i]-'0'+b[j]-'0';}//把字符串转换成数值再相加
else if(i>=0&&j<0)
{sum[p--]=a[i]-'0';}
else if(i<0&&j>=0)
{sum[p--]=b[j]-'0';}
else if(i<0&&j<0)
{break;}
}
p=zb+1;//计算小数点之后的部分
for(;;k++,l++){
if(k<len1&&l<len2)//判断小数点后面是否还有数
sum[p++]=a[k]-'0'+b[l]-'0';//把字符串转换成数值再相加
else if(k<len1&&l>=len2)
sum[p++]=a[k]-'0';
else if(k>=len1&&l<len2)
sum[p++]=b[l]-'0';
else if(k>=len1&&l>=len2)
break;
}
for(i=p-1;i>=0;i--)//进位
if(sum[i]>=10){
sum[i]=sum[i]-10;
sum[i-1]++;
}
i=0;
while(sum[i]==0)//去除前导零
i++;
for(;i<=zb;i++)
printf("%d",sum[i]);//输出整数部分的和
while(sum[p]==0)//去除后导0
p--;
if(p<=zb)//如果结果为整数,去掉小数点
flag=0;
if(flag){//输出整体小数
printf(".");
for(i=zb+1;i<=p;i++)
printf("%d",sum[i]);
}
printf("\n");
}
return 0;
}