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日