【hdoj_1753】大明A+B(大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1753
本题要求是,进行多位的小数加法,由于位数很多,所以不能用double类型存储,可以用字符串存储,然后模拟小数的计算过程.通过一个例子,说明一下我的解题思路:
例如,计算1.2345 + 678.9,思路如下:
去掉小数点之前,记录小数点的位置,当做整数相加的结果,根据小数点的位置,按照小数的形式输出.
C++代码如下:
#include<iostream>
#include<string>
using namespace std; #define max(a,b) (a>b?a:b) int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
int i,j;
int len_1 = s1.length();
int len_2 = s2.length(); for(i=0;i<len_1;i++)
if(s1[i]=='.')
break;
int int_len_1 = i;//s1的整数位长度
int decimal_len_1 = len_1 - int_len_1 - 1;//s1的小数位长度 for(i=0;i<len_2;i++)
if(s2[i]=='.')
break;
int int_len_2 = i;//s2的整数位长度
int decimal_len_2 = len_2 - int_len_2 - 1;//s2的小数位长度 //补齐整数位,使s1和s2的整数位对齐
if(int_len_1<int_len_2)
for(i=1;i<=int_len_2-int_len_1;i++)
s1 = '0' + s1;
else if(int_len_2<int_len_1)
for(i=1;i<=int_len_1-int_len_2;i++)
s2 = '0' + s2; //在s1和s2的前面多加1位0,因为例如:2.6+7.5 = 10.1整数位数变多了.
s1 = '0' + s1;
s2 = '0' + s2; //补齐小数位,使s1和s2小数位对齐
if(decimal_len_1<decimal_len_2)
for(i=1;i<=decimal_len_2-decimal_len_1;i++)
s1 = s1 + '0';
else if(decimal_len_2<decimal_len_1)
for(i=1;i<=decimal_len_1-decimal_len_2;i++)
s2 = s2 + '0'; int node = max(int_len_1,int_len_2)+1;//小数点的下标 //去掉小数点
s1 = s1.erase(node,1);
s2 = s2.erase(node,1); //下面,可以将s1和s2进行整数加法计算.
//模拟"整数"s1和s2的加法过程,结果存在s1中
int len = s1.length();
int c = 0;
for(i=len-1;i>=0;i--)
{
int x = s1[i] - '0';//将s1的某个字符转化为字符对应的数字
int y = s2[i] - '0'; c += (x+y);
s1[i] = (c % 10 + '0');//注意 +'0'是将数字 c%10 转化为对应的字符 c /= 10;
} //至此,计算完毕,下面是输出过程. for(i=0;i<len;i++)
if(s1[i]!='0')//从非零的整数位开始输出
break;
for(j=i;j<node;j++)
cout << s1[j];//输出整数位 for(j=len-1;j>=node;j--)//看看小数为是否都为0
if(s1[j]!='0')
break;
if(j>=node)//在这种情况下,小数为不全为0
{
cout << ".";//输出小数点
for(i=node;i<=j;i++)
cout << s1[i];//输出小数位
} cout << endl;
} return 0;
}
上述代码,提交可以通过.
【hdoj_1753】大明A+B(大数)的更多相关文章
- HDU中大数实现的题目,持续更新(JAVA实现)
HDU1002:大数加法,PE了N次 import java.util.Scanner; import java.math.*; public class Main { public static v ...
- 大明A+B(hdu1753)大数,java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- [HDOJ] 1753.大明A+B (大数加法)
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- (大数 小数点) 大明A+B hdu1753
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 大明A+B(大数相加)解题报告
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- HDUOJ-------1753大明A+B(大数之小数加法)
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 1753 大明A+B(大数)
题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...
- hdu 1753 大明A+B(高精度小数加法)
//深刻认识到自己的粗心,为此浪费了一天.. Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是 ...
- 大数问题,通常用JAVA
e.g. HDU1002 简单加法 import java.math.BigInteger; import java.util.Scanner; public class Main { public ...
随机推荐
- 20135239益西拉姆 Linux内核分析 操作系统是怎样工作的?
益西拉姆+ 原创作品+ <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 堆栈 堆栈是C语言程序运行时 ...
- 函数式编程(1)-高阶变成(1)-map/reduce
map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on ...
- Linux(一)——认识Linux
一.Linux介绍 (安装的是Centos6.7) 1.Linux 系统是一套免费使用和自由传播的类 Unix 操作系统(主要用在服务器上),是一个基于 POSIX 和 UNIX 的多用户.多任务.支 ...
- python 之 strip()--(转载)
原博地址:http://www.jb51.net/article/37287.htm 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾 ...
- kotlin Hello World 以及关键字
hello world:(支持函数式编程,不需要放到 class 中) fun main(args: Array<String>) { println("Hello World& ...
- 对于redis框架的理解(三)
上一篇讲完了initServer的大体流程,其中aeCreateEventLoop(),这个函数 没有详细说明,我们在这一篇里讲述Ae.h和Ae.c, 这里面的api阐述了如何创建 eventLoop ...
- Linux常用网络工具:路由扫描之traceroute
之前两篇<Linux常用网络工具:fping主机扫描>和<Linux常用网络工具:hping高级主机扫描>都是关于主机扫描的,本篇介绍Linux下常用的路由扫描工具tracer ...
- 往android主项目中添加辅助项目
一个较大的工程往往需要多个项目组成,便于更好的并行开发和管理,但最后还是要合到一起来发布.那如何往主项目里添加其他辅助项目呢? 通常的做法是将辅助项目打包成jar包,像库一样导入到主项目,但是如果我们 ...
- centos7 mysql5.7.17源码安装
**安装前准备 操作系统环境:Centos 7.2 1.解决依赖包并下载源码包至/home/soft/目录下 1 2 3 4 5 6 7 [root@node03 ~]# yum -y install ...
- 维护前面的position+主席树 Codeforces Round #406 (Div. 2) E
http://codeforces.com/contest/787/problem/E 题目大意:给你n块,每个块都有一个颜色,定义一个k,表示在区间[l,r]中最多有k中不同的颜色.另k=1,2,3 ...