高精度小数加法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度小数加法相关的知识,希望对你有一定的参考价值。

例题链接:hdu1753    http://acm.hdu.edu.cn/showproblem.php?pid=1753

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 500;
char a[maxn];
char b[maxn];

int aa1[maxn];
int aa2[maxn];
int bb1[maxn];
int bb2[maxn];
int ansx[maxn];
int ansz[maxn];
int main()
{

    while(~scanf("%s%s",&a,&b))
    {

        memset(aa1 , 0 , sizeof(aa1));
        memset(aa2 , 0 , sizeof(aa2));
        memset(bb1 , 0 , sizeof(bb1));
        memset(bb2 , 0 , sizeof(bb2));
        memset(ansx , 0 ,sizeof(ansx));//小数的答案数组
        memset(ansz , 0 ,sizeof(ansz));//整数的答案数组

        int lena, lenb;
        int i,j;
        ///处理串a
        int ta = lena = strlen(a);
        for(i = 0; i < lena ; i++)
        {
            if(a[i] == .)
            {
                ta = i;
                break;
            }
        }
        ///整数逆存存放, 比如 1 2 3 存为 3 2 1
        for(i = ta - 1; i >= 0; i--)
        {
            aa1[ta - i - 1] = a[i] - 0;
        }

        ///小数正序存放 ,比如 4 5 6 存为 4 5 6

        j = 0;
        for(i = ta + 1; i < lena ; i++)
        {
            aa2[j++] = a[i] - 0;
        }

        ///处理串b
        int tb = lenb = strlen(b);
        for(i = 0; i < lenb ; i++)
        {
            if(b[i] == .)
            {
                tb = i;
                break;
            }
        }
        ///整数逆存存放, 比如 1 2 3 存为 3 2 1
        for(i = tb - 1; i >= 0; i--)
        {
            bb1[tb - i - 1] = b[i] - 0;
        }

        ///小数正序存放 ,比如 4 5 6 存为 4 5 6
        j = 0;
        for(i = tb + 1; i < lenb ; i++)
        {
            bb2[j++] = b[i] - 0;
        }


        ///ADD

        ///小数
        int lenaa2 = lena - ta;
        int lenbb2 = lenb - tb;

        int lenx = lenaa2 > lenbb2 ? lenaa2 : lenbb2;
        int jinwei = 0;
        for(i = lenx - 1; i >= 0 ; i--)
        {
            ansx[i] = (aa2[i] + bb2[i] + jinwei)%10;
            jinwei  = (aa2[i] + bb2[i] + jinwei)/10;
        }

        int lenz = ta > tb ? ta : tb;

        for(i = 0; i <= lenz ; i++)
        {
            ansz[i] = (aa1[i] + bb1[i] + jinwei)%10;
            jinwei  = (aa1[i] + bb1[i] + jinwei)/10;
        }

        if(ansz[lenz] > 0)
            lenz++;
        for(i = lenz - 1; i >= 0; i--)
        {
            printf("%d",ansz[i]);
        }

        while(ansx[lenx - 1] == 0)
        {
            if(ansx[lenx - 1] == 0)
            {
                lenx--;
            }
        }

        if(lenx > 0)
            printf(".");

        for(i = 0; i < lenx ; i++)
        {
            printf("%d",ansx[i]);
        }
        printf("\n");
    }
    return 0;
}

 

以上是关于高精度小数加法的主要内容,如果未能解决你的问题,请参考以下文章

单精度浮点数(float)加法计算出错

js 小数点失精度

noi1_13_48[实数加法]

九度OJ小结

js 小数计算失去精度

JavaScript浮点运算,小数点精度