hdu1753(模拟大实数相加)

题目信息: 手动求大实数相加和

http://acm.hdu.edu.cn/showproblem.php?pid=1753

AC代码:

/**

*大实数相加,以小数点为分界,模拟加法运算,最后合并

*/

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

string add(string s1,string s2){//字符串模拟大整数加法,模拟结果有前导0

int i,j,len1,len2;

len1=s1.size(); len2=s2.size();

//寻找小数点的位置

for(i=0;s1[i]!=‘.‘&&i<len1;i++);

for(j=0;s2[j]!=‘.‘&&j<len2;j++);

//cout<<i<<" "<<j<<endl;

string s,ss;

int flag=0;

//模拟小数点后面的数相加

len1--; len2--;

while(len1-i>len2-j){

int sum=flag+(s1[len1--]-‘0‘);

s+=char ((sum)%10+‘0‘);

flag=sum/10;

}

//cout<<s<<endl;

while(len2-j>len1-i){

int sum=flag+(s2[len2--]-‘0‘);

s+=char ((sum)%10+‘0‘);

flag=sum/10;

}

//使小数点后位数对齐之后相加

int len11,len22;

if(len1-i>len2-j){

len11=len1-((len1-i)-(len2-j));

len22=len2;

}

else{

len22=len2-((len2-j)-(len1-i));

len11=len1;

}

while(len11>i&&len22>j){

int sum=flag+(s1[len11--]-‘0‘)+(s2[len22--]-‘0‘);

s+=char ((sum)%10+‘0‘);

flag=sum/10;

}

/**迭代器去除字符’0‘

while(len11>i){

int sum=flag+(s1[len11--]-‘0‘);

s+=char ((sum)%10+‘0‘);

flag=sum/10;

}

while(len22>j){

int sum=flag+(s2[len22--]-‘0‘);

s+=char ((sum)%10+‘0‘);

flag=sum/10;

}

string::iterator it;//定义方向迭代器

for(it=s.begin();*it==‘0‘&&it!=s.end();it++){//去掉s的前缀0,即小数后的0

s.erase(it);

}**/

//cout<<s<<endl;

string ss0;//用ss0去掉前导0

int kk;

for(kk=0;kk<s.size()&&(s[kk]==‘0‘||s[kk]==‘.‘);kk++);

for(int k=kk;k<s.size();k++) ss0+=s[k];

//cout<<ss0<<endl;

for(int i=0;i<ss0.size()/2;i++){

char c=ss0[i];

ss0[i]=ss0[ss0.size()-i-1];

ss0[ss0.size()-i-1]=c;

}

//模拟小数点前面的数相加

len1=i-1; len2=j-1;

while(len1>-1&&len2>-1){

int sum=flag+(s1[len1--]-‘0‘)+(s2[len2--]-‘0‘);

ss+=char ((sum)%10+‘0‘);

flag=sum/10;

}

while(len1>-1){

int sum=flag+(s1[len1--]-‘0‘);

ss+=char ((sum)%10+‘0‘);

flag=sum/10;

}

while(len2>-1){

int sum=flag+(s2[len2--]-‘0‘);

ss+=char ((sum)%10+‘0‘);

flag=sum/10;

}

if(flag) ss+=char (‘0‘+flag);

//cout<<s<<endl;

for(int i=0;i<ss.size()/2;i++){

char c=ss[i];

ss[i]=ss[ss.size()-i-1];

ss[ss.size()-i-1]=c;

}

//cout<<ss<<endl;

if(!ss0.empty()&&ss0[0]!=‘.‘) ss=ss+‘.‘+ss0;

if(!ss0.empty()&&ss0[0]==‘.‘) ss=ss+ss0;

return ss;

}

int main()

{

string s1,s2;

while(cin>>s1>>s2){

cout<<add(s1,s2)<<endl;

}

return 0;

}

时间: 2024-12-28 09:20:26

hdu1753(模拟大实数相加)的相关文章

hdu1753()模拟大型实景数字相加

标题信息: 手动求大的实数在一起, pid=1753">http://acm.hdu.edu.cn/showproblem.php?pid=1753 AC代码: /** *大实数相加,以小数点为分界,模拟加法运算,最后合并 */ #include<iostream> #include<string> #include<algorithm> using namespace std; string add(string s1,string s2){//字符串

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

hdu1047(模拟大数循环相加)

题目信息:多个大整数相加求和,(用add函数循环相加) http://acm.hdu.edu.cn/showproblem.php?pid=1047 AC代码: /** *大数的循环加法,转化为字符串循环相加到字符串为"0" *注意s=="0"的情况,输出数据之间有空格 */ #include<iostream> #include<string> #include<cstdio> using namespace std; stri

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}

实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

//实现大整数相加 //还得考虑符号位,一个比另一个短 #include<iostream> #include <string> #include <cstring> using namespace std; #define maxlen 2001 int a[maxlen]; int b[maxlen]; int len1, len2, i, j; int bigger(int a, int b) { return a>b ? a : b; } void Add

HDU 1002 A + B Problem II(大整数相加)

A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u 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 c

字符串+数组模拟大整数乘法

C/C++中存在精度问题,很难做到大整数的加法和乘法操作,这里给出大整数的模拟乘法运算. 模拟原理: 模拟每一个位的值进行相乘,并使其加到对应的位置上,最后保证每一位的数都小于10,即从尾到头扫描一遍进位即可. 主要代码: k=(mx-i)+(mbx-j);//相乘后的位置 c[k-1]+=sum%10; c[k]+=sum/10; for(t=1;t<=k;++t){//保证每一位上的数都小于10 if(c[t]>=10){ //cout<<c[t]<<"

ACM: A + B Problem II (两个大整数相加)

Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX 1000 //给数组赋值 void arrV(int a[],int len,int p){ int i; for(i=0;i<len;i++){ a[i]=p; } } //打印数组中的运算结果 void printRverse(int a[]){ int len=0,i=0; while(a[i]!=-1){

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需