Time Limit: 1 second

Memory Limit: 2 MB

问题描述

给出两个高精度正实数(可以含有小数点或没有),最长200位,字符串读入 求它们的和,小数部分末尾的0要舍去。

Input

文件输入两行,第一行是被加数,第二行是加数,回车结束输入。

Output

输出求和的值,最后用回车结束

Sample Input

123456789.123456

987654321.4321

Sample Output

1111111110.555556

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=a101

【题解】



把两个数字小数部分的长度变成一样(不足补零);

这样小数部分就对齐了;

然后把小数点去掉;

进行正常的整数高精度加法就好了;

然后在进位的时候先不要把个位的0去掉;

进行完整数高精度加法之后;把小数点加到整数里面去;

然后再去掉个位的0;

要注意整数的情况比如0.9+0.1最后不要输成”1.”要把小数点去掉的。

特判一下就好;

去掉前导的0的话时候要注意别把小数点前的0也删掉了;

不然0.5就会变成.5;



【完整代码】

#include <string>
#include <algorithm>
#include <iostream>
#include <cstdio> using namespace std; const int MAXN = 250; string s1,s2;
int len1,len2;
int a[MAXN],b[MAXN],c[MAXN]={0}; void add0(string &s,int &l,int &r)
{
for (int i = l+1;i <= r;i++)
s+='0';
l = r;
} string sub(string s1,string s2)
{
int len1 = s1.size(),len2 = s2.size();
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
for (int i = 1;i <= len1;i++)
a[i] = s1[i-1]-'0';
for (int i = 1;i <= len2;i++)
b[i] = s2[i-1]-'0';
for (int i = 1;i <= 210;i++)
c[i] = a[i]+b[i];
for (int i = 1;i <= 210;i++)
{
c[i+1] = c[i+1]+c[i]/10;
c[i] %= 10;
}
string temp = "";
for (int i = 1;i <= 210;i++)
{
char key = c[i]+'0';
temp+=key;
}
return temp;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
cin >> s1>>s2;
len1 = s1.size(),len2 = s2.size();
int pos1,pos2;
pos1 = s1.find('.',0),pos2 = s2.find('.',0);
int lp1,lp2;
lp1 = len1-1-pos1,lp2 = len2-1-pos2;
if (pos1!=-1 && pos2!=-1)
{
if (lp1>lp2)
add0(s2,lp2,lp1);
else
add0(s1,lp1,lp2);
s1.erase(s1.find('.',0),1);
s2.erase(s2.find('.',0),1);
}
else
if (pos1!=-1)
{
lp2 = 0;
add0(s2,lp2,lp1);
s1.erase(s1.find('.',0),1);
}
else
if (pos2!=-1)
{
lp1 = 0;
add0(s1,lp1,lp2);
s2.erase(s2.find('.',0),1);
}
else
lp1 = lp2 = 0;
string tempans = sub(s1,s2);
if (lp1!=0)
tempans.insert(lp1,".");
while (tempans!=""&& tempans[0]=='0')
tempans.erase(0,1);
if (tempans=="")
puts("0");
else
{
if (tempans[0]=='.')
tempans.erase(0,1);
reverse(tempans.begin(),tempans.end());
int len = tempans.size();
while (tempans[0]=='0' && tempans[1]!='.')
tempans.erase(0,1);
cout << tempans;
}
return 0;
}

最新文章

  1. SSIS Data Flow 的 Execution Tree 和 Data Pipeline
  2. 使用MAT(Memory Analyzer Tool)工具分析dump文件--转
  3. ActiveX控件打包、签名、嵌入详解
  4. Eclipse tooltip变黑的修正
  5. move
  6. 1.5.1 Analyzers,Tokenizers,Filters概述
  7. 爆牙齿的 Web 标准面试题 【转藏】
  8. uva 10671 - Grid Speed(dp)
  9. Android - 分享内容 - 给其他APP发送内容
  10. directX视频播放------手动连接
  11. 分分钟解决MySQL查询速度慢与性能差
  12. springsecurity 源码解读 之 RememberMeAuthenticationFilter
  13. JavaScript HTML DOM - 改变 CSS
  14. PHP请求ws出现的问题
  15. socket 映射服务器--(可处理多客户端连接(fork),显示退出信息)
  16. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
  17. spring boot: 输出json
  18. 性能加速 - 开启opcache
  19. list文档
  20. mysql oracle计算两点之间的距离

热门文章

  1. centos6.5下 python3.6安装、python3.6虚拟环境
  2. 【习题 8-13 UVA - 10570】Meeting with Aliens
  3. Webservice银行报文接口设计
  4. 洛谷 P1506 拯救oibh总部
  5. vim-录制命令的使用
  6. .NET Entity Framework入门操作
  7. 《一》File 类的介绍
  8. Qt 图片浏览器 实现图片的放大缩小翻转等功能
  9. 目标跟踪系列十一:Exploiting the Circulant Structure of Tracking-by-detection with Kernels代码思路
  10. Python基础教程之第1章 基础知识