大数计算

A+B Problem

描述

acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。

输入

包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)

输出

每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。

样例输入

 1.9 0.1
 0.1 0.9
 1.23 2.1 
 3 4.0

样例输出

 2 
 1
 3.33
 7

OJ:http://acm.nyist.net/JudgeOnline/problem.php?pid=513

问题分析:

数据的存储: 读题可知400位已经超过了double型的范围。可以使用字符串来存储一个数字。题目声明是俩个正数,故不考虑负数情况。
我选择采用一个俩倍大小的int型数组来存储每一位。后400位来存放整数部分a[400]来存放个位,依次递增。前400位来存放小数部分,a[399]来存放十分位,依次递减存储。

算法思路:
初始化:每次计算前需要初始化所有的int[]输出数组的内容为0。
计算:俩个int型的数组相加,从小数精度位开始计算,用一个数来保存进位,将结果放进输出数组中。
输出:题目是有要求的输出,不能输出小数后面的无效0和整数前面的无效0.例如:01.10 应该输出为:1.1

//代码实现,c版本
#include<stdio.h>
#include<string.h>
char s1[410],s2[410];
int a1[820],b1[820];
char result[820];
//转化函数
void create(char s[],int a[])
{
    int len=strlen(s),k,i,j;
    if(strchr(s,'.')!=NULL)//判断有无小数点
        k=strchr(s,'.')-s; //记小数点的位置
    else
        k=len;             // 无小数点 
    for(i=k+1,j=399;i<len;i++,j--)//小数点后面的存放到前400位
        a[j]=s[i]-'0'; 
    for(i=k-1,j=400;i>=0;i--,j++)//小数点前面的整数部分存放在后400位
        a[j]=s[i]-'0';  
} 
//初始化函数
void init()
{
    memset(a1,0,sizeof(a1));
    memset(b1,0,sizeof(b1));
    memset(result,0,sizeof(result));
}
//计算函数
void sum()
{
    int s,v=0,i;//v来保存进位
    for(i=0;i<820;i++)
    {
        s=a1[i]+b1[i]+v;
        result[i]=s%10;
        v=s/10;
    } 
}
//输出函数
void print()
{
    int i=820;
    //去掉整数前面的无效0
    while(result[i]==0&&i>=400)
    {
        i--;
    }
    int j=0;
    //去掉小数后面的无效0
    while(result[j]==0&&j<400)
    {
        j++;
    }
    //如果没有有效位则表明结果是0
    if(i==399&&j==400)
        printf("0\n");
    else
    {
        for(;i>=400;i--)
        {
            printf("%d",result[i]);
        }
        if(j!=400)
        {
            printf(".");
        }
        for(i=399;i>=j;i--) 
            printf("%d",result[i]); 
        printf("\n");    
    }
}
int main()
{
    while(~scanf("%s %s",s1,s2))
    {
        init(); //数据初始化
        create(s1,a1);//数据的转化
        create(s2,b1);//数据的转化 
        sum();//数据的计算
        print();//数据的输出
    }
    return 0;
}    

2017年10月17日

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值