a+b正长小数版(c语言)

7-5 a+b(正长小数版) (5 分)
给定两个正的小数a,b,求a,b之和。需要注意的是,这两个小数的有效数字位数比较多,最大有100位有效数字。

输入格式:
两行,分别表示正小数a,b。该小数一定带有小数点。

输出格式:
两者之和。如果结果小数存在末尾0,均保留。

输入样例:
0.9999999999999999999999999999999999999999999999999999999999
0.0000000000000000000000000000000000000000000000000000000001
结尾无空行
输出样例:
1.0000000000000000000000000000000000000000000000000000000000

代码如下:


#include <stdio.h>
#include <string.h>
//计算小数的位数
int xsws(char* buf)
{
    int i=0;
    int cnt = 0;
    int flag = 0;
    while(buf[i] != '\0')
    {
        if(buf[i]=='.')
            flag = 1;
        else 
        {
            if(flag == 1)
                cnt++;
        }
        i++;
    }
    return cnt;
}

int main()
{
    char a[202]={0},b[202]={0};
    char c[202]={0}; //保存计算结果
    int i,j,t=0,shift = 0;

    int xs1=0,xs2=0,zs1=0,zs2=0; //记录a和b小数和整数的位数
    //读取a和b
    gets(a);
    gets(b);
    //计算两个数整数部分和小数部分的位数
    xs1 = xsws(a); zs1 = strlen(a) - xs1 -1;
    xs2 = xsws(b); zs2 = strlen(b) - xs2 -1;

    if (zs1 > zs2)
    {
        //将b后移zs1-zs2位
        for(i=strlen(b)-1;i>=0;i--)
            b[i+zs1-zs2] = b[i];
        for(i=0;i<zs1-zs2;i++)
            b[i]='0';
    }else if(zs2 > zs1)
    {
        //将a后移zs2-zs1位
        for(i=strlen(a)-1;i>=0;i--)
            a[i+zs2-zs1] = a[i];
        for(i=0;i<zs2-zs1;i++)
            a[i]='0';
    }
    //将小数部分补0
    if(xs1>xs2)
    {
        //将b最后补0
        t = strlen(b);
        for(i=0;i<xs1-xs2;i++)
            b[i+t] = '0';
    }else if(xs2>xs1)
    {
        //将a最后补0
        t = strlen(a);
        for(i=0;i<xs2-xs1;i++)
            a[i+t]='0';
    }

    
    printf("%s\n",a);
    printf("%s\n",b);

    //此时a和b的长度一致
    for (i=strlen(a)-1;i>=0;i--)
    {
        if(a[i]== '.')
        {
            c[i]='.';
            continue;
        }
        t = (a[i]-'0') + (b[i]-'0')+shift;
        shift = 0;
        if(t>=10)
        {
            t-=10;
            shift = 1;
        }
        c[i] = '0'+t; 
    }
    if(shift)
        printf("1%s",c); //如果进位是1,就先输出1,然后输出计算结果(进位不会超过1)
    else
        printf("%s",c);//如果进位是0,输出计算结果
    return 0;
    
}


用字符串接收,从最后一个字符加起来

相当于大数相加。只不过加了小数点。
可以这样建立结构体,
整数部分 char 型数组,和小数部分 char 型数组
然后对 每一位进行加法运算,有1就进1.