ACM1753大明A+B
这道题利用了大数相加,但是需要将小数和整数部分分开,独立相加,然后组合成一个数;
数据的可能性:
1.两个整数相加,没有小数点
2.一个整数一个小数相加
3.两个小数相加
要对上面三种可能性进行分别处理
两个整数相加:存放在数组partone[N],parttwo[N]中,将答案存放在result数组中,用下面代码就可以完成
int t=;
for(int i=;i<maxn;i++)
{
t=partone[i]+parttwo[i]+t;//整数在数组里逆序排放,方便进位
resultone[i]=t%;
t=t/;
}
一个整数和一个小数相加,然后小数部分的字符串子串不需要加法处理,将小数部分取出判断里面是否全为零并且把字符串后面的零全部去掉就可以了,然后只进行整数部分相加,按照上面的过程进行就行
两个小数相加,将整数部分和小数部分都取出分别存放到四个数组中,然后进行小数相加和整数相加,然后判断组合就可以了。
以下为全部代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=;
bool flag;
int partone[maxn],parttwo[maxn],partthree[maxn],partfour[maxn];
int resultone[maxn],resulttwo[maxn];
//第一个数的整数部分 ,第二个数的整数部分,第一个数的小数部分,第二个数的小数部分
//整数部分的计算结果,小数部分的计算结果
void init()//初始化各数组
{
flag=false;//如果是两个小数,标记是否会出现小数相加进位到个位的情况
memset(partone,,sizeof(partone));
memset(parttwo,,sizeof(parttwo));
memset(partthree,,sizeof(partthree));
memset(partfour,,sizeof(partfour));
memset(resultone,,sizeof(resultone));
memset(resulttwo,,sizeof(resulttwo));
}
void ForResultone()//partone and parttwo
{
int t=;
for(int i=;i<maxn;i++)
{
t=partone[i]+parttwo[i]+t;//整数在数组里逆序排放,方便进位
resultone[i]=t%;
t=t/;
}
}
void ForResulttwo()//partthree and partfour
{
int t=;
for(int i=maxn-;i>=;i--)
{
t=partfour[i]+partthree[i]+t;//小数部分在数组里是正序排放,从最后一个元素开始相加
resulttwo[i]=t%;
t=t/;
}
if(t>)//小数部分相加进位到个位的情况
flag=true;
}
void invert(char *s)
{
int len=strlen(s);
char c;
for(int i=;i<len/;i++)
{
c=s[i];
s[i]=s[len-i-];
s[len-i-]=c;
}
}
int main()
{
char parts[maxn],parti[maxn];
while(scanf("%s %s",parts,parti)!=EOF)
{
init();
//if there are two integers
if(strchr(parts,'.')==NULL&&strchr(parti,'.')==NULL)
{
int temp=strlen(parts);
for(int i=temp-;i>=;i--)
{
partone[temp-i-]=parts[i]-'';
}
int temp2=strlen(parti);
for(int i=temp2-;i>=;i--)
{
parttwo[temp2-i-]=parti[i]-'';
}
//上面分别把两个字符串中的整数存放到数组中,然后再下面的函数中相加
ForResultone();
int re=;
for(int i=maxn-;i>=;i--)//把相加得到的结果的前面的零全部去掉
if(resultone[i])
{
re=i;
break;
}
for(;re>=;re--)
{
printf("%d",resultone[re]);
}
printf("\n");
continue;
}
//if one of them is integer while another is float number
else if(strchr(parts,'.')==NULL||strchr(parti,'.')==NULL)
{
char *re1,*re2;//re1 has the point
//让re1代表有小数的字符串,re2代表整数字符串
if(strchr(parts,'.')!=NULL)
{
re1=parts;
re2=parti;
}
else
{
re1=parti;
re2=parts;
}
char *last=strchr(re1,'.');last++;//用last标记小数部分的字符串
int ll=strlen(last);ll--;
while(ll>=&&last[ll]=='')
{
ll--;
}//去掉小数部分后面所有的零 ,如果全是零ll会小于零
int lre=strlen(re1);
lre--;
while(re1[lre]!='.')//找整个字符串中小数点的位置
{
lre--;
}
lre--;
for(int i=;lre>=;lre--,i++)//将re1的整数部分存放到数组中
{
partone[i]=re1[lre]-'';
}
int lre2=strlen(re2);lre2--;
for(int i=;lre2>=;lre2--,i++ )//将re2存放到数组中
{
parttwo[i]=re2[lre2]-'';
}
ForResultone();
int re=;
for(int i=maxn-;i>=;i--)
if(resultone[i])
{
re=i;
break;
}
for(;re>=;re--)
{
printf("%d",resultone[re]);
}
if(ll>=)
{
printf(".");
for(int i=;i<=ll;i++)
printf("%c",last[i]);
}
printf("\n");
continue;
}
//two float numbers
char *last1=strchr(parts,'.');last1++;//取小数部分
char *last2=strchr(parti,'.');last2++;
int len1=strlen(parts);len1--;
int len2=strlen(parti);len2--;
int len3=strlen(last1);
int len4=strlen(last2);
for(int i=;i<len3;i++)
partthree[i]=last1[i]-'';
for(int i=;i<len4;i++)
partfour[i]=last2[i]-'';//把小数部分存放到数组中
ForResulttwo();
int sign=maxn-;
while(sign>=&&resulttwo[sign]==)//去掉小数部分相加后后面的零,如果全为零sign小于零
sign--;
int for1=len1-len3-;//取整数部分的长度
int for2=len2-len4-;
for(int i=;for1>=;for1--,i++)
partone[i]=parts[for1]-'';
for(int i=;for2>=;for2--,i++)
parttwo[i]=parti[for2]-'';
if(flag)partone[]+=;//如果小数部分相加后进位
ForResultone();
int re=;
for(int i=maxn-;i>=;i--)
if(resultone[i])
{
re=i;
break;
}
for(;re>=;re--)
{
printf("%d",resultone[re]);
}
if(sign>=)//如果有小数部分
{
printf(".");
for(int i=;i<=sign;i++)
printf("%d",resulttwo[i]);
}
printf("\n");
}
return ;
}
这个题目是足够的麻烦,思路要清晰,耐心要足够。
ACM1753大明A+B的更多相关文章
- TCP/IP之大明内阁---协议的制定
个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果, ...
- TCP/IP 之大明王朝邮差
本系列文章全部摘选自"码农翻身"公众号,仅供个人学习和分享之用.文章会给出原文的链接地址,希望不会涉及到版权问题. 个人感言:真正的知识是深入浅出的,码农翻身" 公共号将 ...
- TCP/IP之大明王朝邮差
一位大神的精华之作,原创2016-05-12 刘欣 来自码农翻身! 时间: 大明王朝天启四年, 清晨. 天色刚蒙蒙亮,我就赶着装满货物的马车来到了南城门,这里是集中处理货物的地方,一队一队的马车都来到 ...
- hdu 1753 大明A+B(高精度小数加法)
//深刻认识到自己的粗心,为此浪费了一天.. Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是 ...
- 大明A+B
大明A+B 时间限制: 1 Sec 内存限制: 32 MB 以内加法的那个"小明"了,现在他甚至会任意长度的正小数的加法.现在,给你两个正的小数A和B,你的任务是代表大明计算出A ...
- (大数 小数点) 大明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以内加法的那个"小明 ...
- 大明A+B(hdu1753)大数,java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- TCP/IP之大明内阁 转
原创: 刘欣 码农翻身 2016-11-02 本文是<TCP/IP之大明王朝邮差>的前传, 讲一讲大明内阁的各位大人是怎么设计TCP/IP网络的.大明天启年间, 明熹宗朱由校醉心于木工 ...
随机推荐
- loadrunner_遇到cookie接口_3种应对方法
方法一:是调用登录接口,在调用登录后的接口 方法二:手动储存cookie,写死cookie 方法一:提前登录收集cookie,写成参数化文件 方法一,案例(就是先登录,再写登录后的接口): 注:use ...
- Window下部署MySql数据库
官网下载地址:https://dev.mysql.com/downloads/mysql/,MySQL Community(社区版) Server 5.7.21,下载完毕后,解压文件. (1)在mys ...
- github 使用“git commit -m"命令时候出现的一个小问题
git commit -m 使用问题 今天提交文件到github,步骤是: git add abc.py (abc.py是我当前随意写的一个文件名) git commit -m 'add codes ...
- 特殊符号 & 以太坊
&表示取二进制的末尾 &1表示如果末尾是奇数和偶数两种情况 0 偶数 1奇数 举例子: int a=1;int p=&a; 其中,p是指针,&a就是将a在内存中的实际地 ...
- CSS动画@-webkit-keyframes
@-webkit-keyframes:以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%.0% 是动画的开始时 ...
- 操作系统及Python解释器工作原理讲解
操作系统介绍 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 操作系统功能: 控制硬件 把对硬件复杂的操作封装成优美简单的接口(文件),给用户或者应用程 ...
- 微信小程序学习:开发注意点
11月2日更新: 微信小程序支持内嵌网页,新增 <web-view /> 组件调试支持: 传送门 <!-- wxml --> <!-- 指向微信公众平台首页的web-vi ...
- wpa_supplicant与kernel交互
wpa_supplicant与kernel交互的操作,一般需要先明确驱动接口,以及用户态和kernel态的接口函数,以此来进行调用操作.这里分为4个步骤讨论. 1.首先需要明确指定的驱动接口.因为有较 ...
- http://www.cnblogs.com/120626fj/p/7545958.html
1.本周PSP 2.本周进度条: 代码行,博文字数,用到的知识点 3.累计进度图 3.1累计代码折线图 3.2累计博文字数折线图 4.本周PSP饼状图
- 软件工程 作业part2 采访
Part 2 采访本课程往届同学(含外校和毕业生). 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下. 我采访的是2016级于淼 ...