【hdoj_1753】大明A+B(大数)

2024-03-24 23:18
文章标签 大数 hdoj 大明 1753

本文主要是介绍【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--)//看看小数为是否都为0if(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(大数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843100

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

找第K大数(ACdream 1099)

瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others)  Memory Limit: 256000/128000KB (Java/Others) Submit  Statistic  Next Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。

SDUT2876_走楼梯(大数)

走楼梯 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小虎发现走楼梯的时候一次上一个台阶比较惬意,一次上两个台阶比较高效,一次上三个台阶就很累人。 小虎是一个即注重质量又注重高效的人,于是他就在上楼梯的时候每步就只跨上一个台阶或两个台阶, 现在小虎想知道他这样上n阶的楼梯一共有多少种走法,但

【高精度】-DLUTOJ-1176-大数乘法

题目链接:http://acm.dlut.edu.cn/problem.php?id=1176 题目描述:赤裸的大数乘法 解题思路: 突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉:“ 想写大数乘法就得先写一个大数加法出来 ”。喂!我短路了半天才想明白,int 数组里可以存个两位数啊,再

大数问题 *

问题 N : A + B Problem II 时间限制:1 秒内存限制:32 兆特殊判题: 否 提交:58解决: 10 标签 输入输出练习 题目描述 I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.

大数求和问题

A + B Problem II Problem Description I have a very simple problem for you. Given two  integers(整数) A and B, your job is to calculate the Sum of A + B. Input The first line of the input contains a

就一个简单的大数计算

也只是刚刚写出了加法,用的是1 000 000 000进制,不过发现对于加法还不如用最基本的方法方便。用1 000 000 000进制的方便也就在于处理乘法和除法了。计算机做乘除运算还是比较耗时的。 #include <random>#include <iostream>#include <fstream>#include <string>#include <vector>#inclu

HDU 1130(卡特兰数,大数)

题意:如题。   import java.util.*;import java.math.*;public class Main{public static void main(String[] args) {int n;Scanner in=new Scanner(System.in);BigInteger one=BigInteger.ONE;BigInteger four