hdu 1753 大明A+B(高精度小数加法)
//深刻认识到自己的粗心,为此浪费了一天。。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
1.1 2.9 1.1111111111 2.3444323343 1 1.1
4 3.4555434454 2.1
/*************************
继续大数,这次是大 小数,
我用了一个结构体 分别存放 小数的 整数部分 和 小数部分,两个数组,分别相加,进位 分别处理,同时要注意
前导0 和 后导0
的处理。。详细看代码
************************/
- // 小数 位的加法有问题
- #include <iostream>
- #include <string.h>
- #include <stdio.h>
- using namespace std;
- #define N 8000
- struct Bint// 大数的结构体
- {
- int high[N/2];// 存放整数位
- int low[N/2];// 存放小数位
- int p;// 整数位非零位数
- int del; // 小数位非零位数
- };
- int Find(char a,char str[])// 找小数点的位置,实际返回的是整数部分的位数
- {
- int i,len = strlen(str);
- for(i = 0;i<len;i++)
- if(str[i]==a)
- return i;
- return len;// 整数时直接返回 长度
- }
- void print(struct Bint s)// 输出函数
- {
- int i;
- for(i = s.p-1;i>=0;i--)
- printf("%d",s.high[i]);
- if(s.del>0){
- printf(".");
- for(i = 0;i<s.del;i++)
- printf("%d",s.low[i]);
- }
- printf("\n");
- }
- void trans(Bint &a,char str[])// 将输入的字符串形式的数 转换为结构体
- {
- memset(a.high,0,sizeof(a.high));
- memset(a.low,0,sizeof(a.low));
- int len = strlen(str);
- a.p = Find('.',str);
- a.del = (len==a.p)?0:(len-a.p-1);// 如果包含小数点则小数位数为 数的长度-整数位数-1
- int i=0,ii = 0,jj = 0,pa= a.p,l = len-1;
- while(str[i++]=='0'&&i<pa)// 去除前导0
- a.p--;
- while(str[l--]=='0'&&l>=pa)// 去除 后导 0
- a.del--;
- for(i = pa-1;i>=pa-a.p;i--)// 整数位赋值
- a.high[ii++] = str[i]-'0';
- for(i = pa+1;i<pa+1+a.del;i++)// 小数位 赋值
- a.low[jj++] = str[i]-'0';
- }
- void add(char A[],char B[])// 加法 代码核心
- {
- int i;
- Bint a,b,ans;// ans 存 结果
- memset(ans.low,0,sizeof(ans.low));
- memset(ans.high,0,sizeof(ans.high));
- trans(a,A);
- trans(b,B);
- ans.p = (a.p>b.p)?a.p:b.p;// 取a,b 整数位的最大值
- ans.del = (a.del>b.del)?a.del:b.del;// 同上,取小数位
- // 以下两个循环为逐位相加的过程
- for(i = 0;i<ans.p;i++)
- ans.high[i] = a.high[i]+b.high[i];
- for(i = 0;i<ans.del;i++)
- ans.low[i] = a.low[i]+b.low[i];
- // 进位处理
- for(i = ans.del-1;i>0;i--)
- {
- if(ans.low[i]>=10)
- {
- ans.low[i-1]+=ans.low[i]/10;
- ans.low[i]%=10;
- }
- }
- //小数位第一位有进位时的处理
- if(ans.low[0]>=10)
- {
- ans.high[0]+=ans.low[0]/10;
- ans.low[0]%=10;
- }
- for(i = 0;i<ans.p;i++)
- {
- if(ans.high[i]>=10)
- {
- ans.high[i+1]+=ans.high[i]/10;
- ans.high[i]%=10;
- }
- }
- if(ans.high[ans.p]>0)
- ans.p+=1;
- // 相加以后产生后导 0 的处理
- while(ans.low[ans.del-1]==0)
- ans.del--;
- print(ans);
- }
- int main()
- {
- char A[N],B[N];
- while(cin>>A>>B)
- {
- add(A,B);
- }
- return 0;
- }
hdu 1753 大明A+B(高精度小数加法)的更多相关文章
- HDU 1753 大明A+B (大正小数加法、字符串处理)
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- FZU 2032 高精度小数加法
题目描写很没意思..就是说给出n个小数 求它们的总和 因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double ...
- hdoj 1753 大明A+B 高精度/java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [HDOJ] 1753.大明A+B (大数加法)
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- hdu 1753 大明A+B
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1753 容易出错的事例: 0.1 0.2 1.88 22.22 1 0.01 大概出错的几个点,做久了思维根 ...
- hdu 1753 大明A+B(大数)
题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...
- HDU 1753 大明A+B(字符串模拟,简单题)
简单题,但要考虑一些细节: 前导0不要,后导0不要,小数长度不一样时,有进位时,逆置处理输出 然后处理起来就比较麻烦了. 题目链接 我的代码纯模拟,把小数点前后分开来处理,写的很繁杂,纯当纪念——可怜 ...
- hdu 1316 How many Fibs?(高精度斐波那契数)
// 大数继续 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn : ...
- BigDecimal类(高精度小数)
位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * ...
随机推荐
- Xcode8 创建NSManageObject subclass方法
更新iOS8之后发现coredata也做了一些改变,创建本地的时候一脸懵逼,最后发现: 喜极而泣不能自已,(-.-!)
- lunix机器的jdk安装
本来不想写这篇博客的,写在这儿只是作为自己的笔记,jdk安装了千万编,但是踩过的坑老是不记,看别人的博客又各种不爽,所有索性自己写一个得了.老规矩,无图. Oracle版本的jdk下载地址:http: ...
- C#实现在Winform中嵌入Word和Excel
http://www.cnblogs.com/wuzi145/archive/2012/05/08/2490680.html 在此只是介绍一个简单控件:dsoframer.ocx的使用,这个控件需要通 ...
- PHP 环境塔建与数据类型转换
手动塔建PHP开发环境 安装php c:\apps\php 安装apache c:\apps\apache 1.配制apache 配制c:\apps\apache\conf\httpd.conf Do ...
- 定时自动同步文件,支持多文件夹同步,支持过滤文件和文件夹,解决FileSystemWatcher多次文件触发事件(源码)
博客园里面有很多同步工具和软件,关于FileSystemWatcher类解释的也很多,但收集了很多文章后,感觉没好的方法,自己没事写了一个定时文件同步,借鉴了很多博客园朋友的东西: 上主菜: 配置文件 ...
- Win7家庭普通版、家庭高级版、专业版、旗舰版版本差别
刚才我们发了一个大图片:<Windows7.Vista.XP 三大系统功能差异比较一览图>,现在,再发一张对比图片,简要的看看Windows7家庭普通版.家庭高级版.专业版.旗舰版这四个版 ...
- iOS给背景添加点击事件
当点击背景的时候出发事件,或者跳转界面或者产生其他的响应 -(void)viewDidLoad { UIImageView * imageView = [UIImageView alloc]init ...
- Distributed locks with Redis--官方
原文:http://redis.io/topics/distlock Distributed locks with Redis Distributed locks are a very useful ...
- Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理
Fixflow内核运转图v1.0(beta) 未完待续.........
- IIS 之 启用日志记录
如何为网站启用日志记录或 在 Microsoft Internet Information Services (IIS) 6.0 中,在 IIS 5.0 中,并在 IIS 4.0 中的FTP 站点.可 ...