HDU1753 大明A+B(带小数的大数加法)

来源:互联网 发布:阿里云如何购买域名 编辑:程序博客网 时间:2024/06/02 13:21

Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 
 

Input

本题目包含多组测试数据,请处理到文件结束。 
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
 

Output

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。 
 

Sample Input

1.1 2.91.1111111111 2.34443233431 1.1
 

Sample Output

43.45554344542.1
分析:

算是一道模拟题,用C语言些相对复杂,但用Java就非常简单,但我觉得还是要用C语言写一遍,理解其中的原理,对于自己解决问题的能力还有思维能力有一个提高!

首先是c语言版的:

#include <stdio.h>#include <string.h>char str1[401], str2[402];int a[401], b[401];void Fun(char str[])//处理字符串{    int len = strlen(str);    int index=len;//首先赋值整数长度为字符串长度    for(int i = 0; i < len; i++)        if(str[i] == '.') index = i;//寻找整数长度    int k = 0;    for(int i = index - 1; i >= 0; i--)//把整数部分赋值给a数组        a[k++] += (str[i] - '0');    k = 0;    for(int i = index+1; i < len; i++)//把小数部分赋值给b数组        b[k++] += (str[i] - '0');}void Output()//计算{    int x1=0, x2=0;    bool flag = 0;    int k = 0;    bool flag2  = 1;    for(int i = 400; i >= 0; i--)//小数部分相加    {        b[i] += k;        k = b[i]/10;       b[i] %= 10;        if(b[i] != 0 && flag2)        {            x2 = i;//寻找不为0的,也就是小数结束的位置            flag2  = 0;//标记,说明有小数部分        }    }    for(int i = 0; i < 400; i++)//整数部分相加    {        a[i] += k;        k = a[i]/10;        a[i] %= 10;        if(a[i] != 0)            x1 = i;//寻找整数开始的位置    }    if(k != 0)//如果k为0,说明小数相加取得的结果大于0,需要进位    {        a[400] += k;        x1 = 400;    }    for(int i = x1; i >= 0; i--)//输出整数        printf ("%d", a[i]);    if(!flag2)//如果有小数,输出小数部分    {        printf (".");        for(int i = 0; i <= x2; i++)            printf ("%d", b[i]);    }    printf ("\n");}int main(){    while (~scanf ("%s %s", str1, str2))    {        memset(a, 0, sizeof(a));        memset(b, 0, sizeof(b));        Fun(str1);        Fun(str2);        Output();    }    return 0;}
还有Java:

import java.util.*;import java.io.*;import java.math.*;public class Main{    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        while(in.hasNext())        {            BigDecimal a = in.nextBigDecimal();            BigDecimal b = in.nextBigDecimal();            System.out.println(a.add(b).stripTrailingZeros().toPlainString());            //stripxxxx 去掉后置0            //toplainstring是返回普通计数法        }    }}



0 0
原创粉丝点击