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网络的.大明天启年间, 明熹宗朱由校醉心于木工 ...
随机推荐
- 同台服务器 部署多个tomcat 需要做的修改
需要修改以下加粗部分: 1:访问端口 8080->8081 2:shutdown 端口 8005->8015 3: AJP端口 8001->8010 <?xml version ...
- JSP页面中文乱码问题
$.get()方法到服务器端中文乱码 在jsp页面使用encodeURI(“中文”),在服务器端进行解码 String name = req.getParameter("name" ...
- Y460蓝牙键盘无法连接问题解决
mac坏了,无法启动,一直没时间去修理. 近期把大学的时候用的笔记本又翻了出来,小Y,经典的“娱乐本” Y460. Y460上之前被自己各种重装系统,反复从windows到双系统,再到linux之间来 ...
- LeetCode 240——搜索二维矩阵 II
1. 题目 2. 解答 2.1. 方法一 从矩阵的左下角开始比较 目标值等于当前元素,返回 true: 目标值大于当前元素,j 增 1,向右查找,排除掉此列上边的数据(都比当前元素更小): 目标值小于 ...
- LiveVideoStack Meet|深圳 多媒体开发新趋势
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- 十:HDFS Short-Circuit Local Reads 短路本地读取
当client请求数据时,datanode会读取数据然后通过TCP协议发送给client.short-circuit绕过了datanode直接读取数据.short-circuit的前提是client和 ...
- Internet Secure
key Secret key(密钥):ues the same key to Encryption and decryption(symmetric-key)对称加密,需要绝对安全的空间来传递key ...
- “小葵日记”API接口文档
"小葵日记"项目API接口文档 时间:2017/10/31 (1)用户登录[待完成] POST:127.0.0.1/index/user/login data 数据别称 数据名 数 ...
- lintcode-32-最小子串覆盖
最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"" ...