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网络的.大明天启年间, 明熹宗朱由校醉心于木工 ...
随机推荐
- hive使用spark引擎的几种情况
使用spark引擎查询hive有以下几种方式:1>使用spark-sql(spark sql cli)2>使用spark-thrift提交查询sql3>使用hive on spark ...
- Java进阶知识点:并发容器背后的设计理念
一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...
- HDU 2491 Priest John's Busiest Day(贪心)(2008 Asia Regional Beijing)
Description John is the only priest in his town. October 26th is the John's busiest day in a year be ...
- canvas学习(四):高级属性
一:阴影 示例:绘制一个带有阴影的正方形 var canvas = document.getElementById("myCanvas") var ctx = canvas.get ...
- Python如何运行
Python是一种解释型语言,在执行Python的时,解释器将源代码source code翻译成字节码byte code,然后byte code交给Python虚拟机PVM去执行,整个流程如下图所示: ...
- 深搜(DFS)与广搜(BFS)区别
最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...
- Lecture Sleep(尺取+前缀和)
Description 你的朋友Mishka和你参加一个微积分讲座.讲座持续n分钟.讲师在第i分钟讲述ai个定理. 米什卡真的对微积分很感兴趣,尽管在演讲的所有时间都很难保持清醒.给你一个米什卡行 ...
- LintCode-212.空格替换
空格替换 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是"真实的"字符长度. 你的程序还需要返回被替换后的字符串 ...
- JDK源码分析 – LinkedList
LinkedList类的申明 public class LinkedList<E> extends AbstractSequentialList<E> implements L ...
- 无法打开mfc120.lib
今天在用VS2013编译OSG的时候报错:无法打开mfc120.lib.仔细查了下资料. 我是这么解决的: 安装Multibyte MFC Library for Visual Studio 2013 ...