高精度小数加法

例题链接: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;
}
时间: 2024-10-10 10:29:16

高精度小数加法的相关文章

FZU 2032 高精度小数加法

题目描写很没意思..就是说给出n个小数 求它们的总和 因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double 于是它就是一个很裸的小数高精度加法..还只是加法.. 在比赛的时候学长很快就敲出来了代码并且AC 但是被别人极多提交的极短且超时代码唬住(猜测应该是直接相加) 以为直接相加的O(N)的复杂度尚且不可..所以甚至连试做都没有 赛后写出代码F9直接运行 但是小数上的进位转到整数上遗漏 更改后AC #i

BigDecimal类(高精度小数)

位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * 10-scale)其中,unscaledValue(非标度值)为任意精度的整数.scale(标度)为32位整型(可为负) 提供以下操作:算术.标度操作.舍入.比较.哈希算法和格式转换. 用户能通过提供MathContext对象完全控制BigDecimal的舍入行为(也可使用类内提供的8种舍入模式).

hdu 1063 Exponentiation (高精度小数乘法)

//大数继续,额,要吐了. Problem Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. This problem re

Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算. package com.ietree.base.number; import java.math.BigDecimal; import java.math.BigInteger; public c

【高精度】加法天才

问题 A: [高精度]加法天才 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 10[提交] [状态] [讨论版] [命题人:] 题目描述 贝贝是一个聪明的小孩,他总喜欢玩数字加法的游戏.一天,他的数学老师为了考一考他的能力,出了一道这样的题:要求他在短时间内计算出两个大数相加的结果.这两个大数可不是普通的数字,它们是11位以上的"庞然大物". 请你编程序,帮贝贝解决这个问题. 输入 两行,分别是两个需要相加的数A和B,这两个数在10^11-10^100之间.

0.28+0.34=? 一个简单小数加法引发的思考

0.28+0.34=? 我相信这个简单的加法,谁都会,肯定等于0.62嘛. 这是两个特别简单的加法,那如果我在其整数位置上加上其他的数字,或者多加几个和项,你是否还能快速算过来? 我想这时候,我们又得借助计算器了!而这,有时可能就是电脑!尤其是如果咱们借助简单程序语言来算的时候,嘿嘿,可能就不是那么回事了~ 不信你看,用javascript算的结果: 用python算的结果: 当然了,我尝试着用其他语言来试一下,结果好像并不都是这样. 其中,java只会在类型转换的时候出现奇怪的值:(当然这在我

高精度计算(二) /*高精度的加法运算*/

例 高精度加法运算 输入正整数 a 和 b,输出 a+b 的值.0<a,b<=10^250 输入: 第一行:a 第二行:b   输出:a+b 的和. 样例输入: 99    999 样例输出: 1098 分析: (1)加法运算      -- a[7]  a[6]  a[5]  a[4]  a[3]  a[2]  a[1] -+-   0      0    b[5]  b[4]  b[3]  b[2]  b[1] ----------------------------------    

整数高精度运算——加法

高精度运算是信息学的一种重要算法.这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法.也是一些信息学竞赛的常考题目. 高精度运算主要有以下几个步骤: 1.读取字符串,转换成数字倒序存储到整数数组中: 2.运算,注意进位和借位: 3.倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出: 高精度加法代码: #include<stdio.h>#include<string.h>char s[1000];       //数组比较大时,应作

YT14-HDU-A+B(高精度小数)

Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明"了,现在他甚至会任意长度的正小数的加法. 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值. Input 本题目包含多组测试数据,请处理到文件结束. 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B. Output 请在一行里面输出输出A+B的值,请输出最简形式.详细