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;
}

【a101】高精度实数加法的更多相关文章

  1. java高精度实数和小数

    java 高精度实数和小数 String s = "1231222222222222222222222222222222222222222222222222222222"; Big ...

  2. FZU 2032 高精度小数加法

    题目描写很没意思..就是说给出n个小数 求它们的总和 因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double ...

  3. hdu 1753 大明A+B(高精度小数加法)

    //深刻认识到自己的粗心,为此浪费了一天.. Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是 ...

  4. hdu Exponentiation高精度实数乘幂(用了带小数的高精度模板)

    #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...

  5. 无线OSS-高精度整数加法

    #include<iostream> #include<string> using namespace std; int compareStr(string str1, str ...

  6. POJ 1504 Adding Reversed Numbers (水题,高精度整数加法)

    题意:给两个整数,求这两个数的反向数的和的反向数,和的末尾若为0,反向后则舍去即可.即若1200,反向数为21.题目给出的数据的末尾不会出现0,但是他们的和的末尾可能会出现0. #include &l ...

  7. hdu 1316 How many Fibs?(高精度斐波那契数)

    //  大数继续 Problem Description Recall the definition of the Fibonacci numbers:  f1 := 1  f2 := 2  fn : ...

  8. HDU ACM 1063 Exponentiation 大实数乘方

    分析:大实数乘方计算. #include<iostream> #include<string> using namespace std; struct BigReal //高精 ...

  9. 高精度运算专题1-加法运算(The addition operation)

    这个专题呢,我就来讲讲高精度的加法,下面是一个计算加法的函数(用数组a加上数组b结果存到数组c里面). 思路:先测一下数组a和数组b的长度,分别放到a[0].b[0]里面去,再从第二位开始相加,记得满 ...

随机推荐

  1. 【习题 8-1 UVA - 1149】Bin Packing

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个背包只能装两个东西. 而且每个东西都要被装进去. 那么我们随意考虑某个物品.(不必要求顺序 这个物品肯定要放进某个背包里面的. ...

  2. 项目EasyUi和JS中遇到的问题总汇

    近期因为项目用到EasyUi,曾经仅仅是听过,可是没有详细用过.仅仅能一边学一边做.如今将做的过程中遇到的一些难点总结例如以下,以备后用: EsayUi使用: Json格式:key:value,key ...

  3. mahout的特性(三)

    mahout的特性 虽然在开源领域中相对较为年轻,但 Mahout 已经提供了大量功能,特别是在集群和CF 方面. Mahout 的主要特性包括: Taste CF.Taste 是 Sean Owen ...

  4. go-web编程之处理xml

    摘抄自astaxie的开源书籍 build-web-application-with-golang 接下来的例子以下面XML描述的信息进行操作. <?xml version="1.0& ...

  5. BZOJ3697: 采药人的路径(点分治)

    Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动 ...

  6. vmware workstation安装windows server 2019

    提示需要输入密钥,选择[我没有密钥] 选择有桌面体验的 自定义 新建C盘 100G 选择100G的主分区,下一步 PS:未分配的空间,先不理,安装完系统,进桌面,再分配 开始安装.接下来就是等. 等. ...

  7. Ubuntu配置sublime text 3的c编译环境

    新建编译系统 c语言 选择tool –> Build System –> New Build System 然后输入下面代码 { "shell_cmd": " ...

  8. android-铃声的设置与播放

    在android系统中,不同铃声存放的铃声路径: /system/media/audio/ringtones 来电铃声 /system/media/audio/notifications 短信通知铃声 ...

  9. django 简单会议室预约(1)

    django 是python的一个web框架,为什么要用django,作者之前用过另一个框架flask,虽然flask比较简单很容易让人学,但是flask没有整体感,会让初学着茫然. 这里我们用dja ...

  10. 使用Invoke解决多线程间的控件访问出错

    // 按钮点击事件处理程序private void button1_Click(object sender, EventArgs e){    //创建新线程    Thread processorT ...