2738:实数加法
来源:互联网 发布:360智能路由器软件 编辑:程序博客网 时间:2024/04/29 06:04
2738:实数加法
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。- 输入
- 2行,每行是一个加数。每个加数的长度不超过100。
- 输出
- 一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
- 样例输入
0.1111111111111111111111111111110.111111111111111111111111111111
- 样例输出
0.222222222222222222222222222222
大致记录下解题思路,可能有点笨拙,首先是通过小数点将字符串分为两部分,一个小数部分ah,bh,一个数整数部分,af,bf,然后写一个逆序函数,因为字符串表示的树最高位是在a[0],b[0],我们模拟加法时,一旦出现进位,这时候处理最高位很麻烦,所以将其逆序,比如:456-》654,789-》987,处理·987+654相加比处理,456+789方便的多,如果出现进位,我们往数组的后一位继续加即可,得到的结果是两个字符串相加结果的逆序数,将逆序结果逆序过来后,就是正确的结果,写一个大数相加函数。在写一个除去小数部分相加结果末尾处多余0的函数,最后在输出时printf("%s.%s\n",add1,add2);(此处注意一点,这个bug坑了半天,就是for循环中,循环变量i,j的值,及时定义在循环体外部,出了循环体后,i,j的值会更新为0或者1,所以我们需要一个max0变量记录下来两数相加后最大的位数);
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define N 110
void ni(char a[])
{
int len=strlen(a);
char b[N];
for(int i=0;i<len;i++)
b[i]=a[i];
for(int i=0;i<len;i++)
a[i]=b[len-1-i];
}
int flag=0;
void add(char a[],char b[])
{
ni(a);
ni(b);
int lena=strlen(a),lenb=strlen(b),i,j;
for(i=0;i<lena&&i<lenb;i++){
int t=a[i]-'0'+b[i]-'0'+flag;
a[i]=t%10+'0';
flag=t/10;
}
int max0=i;
for(j=i;j<lena;++j){
int t=a[j]-'0'+flag;
a[j]=t%10+'0';
flag=t/10;
max0=j+1;
}
for(j=i;j<lenb;++j){
int t=b[j]-'0'+flag;
a[j]=t%10+'0';
flag=t/10;
max0=j+1;
}
if(flag==1)
{
a[max0]='1';
a[max0+1]='\0';
}
else
a[max0]='\0';
}
void qu(char a[])
{
int len=strlen(a);
int i=0;
while(a[i]=='0'){
i++;
}
for(int j=0;j<len-i;j++){
a[j]=a[j+i];
}
a[len-i]='\0';
}
int main()
{
char a[N],b[N];
while(scanf("%s %s",a,b)!=EOF){
int lena=strlen(a),lenb=strlen(b);
char af[N],ah[N],bf[N],bh[N];
int i,j;
for(i=0;i<lena;i++)
{
if(a[i]=='.')
break;
af[i]=a[i];
}
af[i]='\0';
for(j=i+1;j<lena;j++){
ah[j-i-1]=a[j];
}
ah[j-i-1]='\0';
for(i=0;i<lenb;i++)
{
if(b[i]=='.')
break;
bf[i]=b[i];
}
bf[i]='\0';
for(j=i+1;j<lenb;j++){
bh[j-i-1]=b[j];
}
bh[j-i-1]='\0';
int lenah=strlen(ah),lenbh=strlen(bh),maxlen=lenah;
if(lenah<lenbh){
for(int i=lenah;i<lenbh;i++){
ah[i]='0';
}
ah[lenbh]='\0';
maxlen=lenbh;
}
else if(lenah>lenbh){
for(int i=lenbh;i<lenah;i++){
bh[i]='0';
}
bh[lenah]='\0';
}
add(ah,bh);
ah[maxlen]='\0';
qu(ah);
ni(ah);
add(af,bf);
ni(af);
int lenaaf=strlen(af);
printf("%s.%s\n",af,ah);}
return 0;
}
- 2738:实数加法
- 实数加法
- 百练2738:实数加法题解
- HDU-1753 实数高精度加法
- Openjudge 1.13 33:实数加法
- NYOJ A+B Problem IV 高精度正实数加法
- 实数
- 实数
- 实数
- 加法
- 加法
- 实数 虚数
- 实数集合
- 实数四舍五入
- 实数比较
- 实数四舍五入
- 什么是实数
- 实数系与实数定理
- The constructor Date() is undefined
- 算法题:比大小<思路重要>
- 硬盘和软盘的引导扇区结构
- 【考研日记1】:2016-8-27
- R语言多元线性回归分析
- 2738:实数加法
- 我做服务器的岁月3
- iOS swift-自定义转场动画_实现modal控制器显示与消失时的透明度渐变
- 初识MyBatis框架
- 段界限为什么要减1
- java多态
- 《Java源码分析》:BlockingQueue之ArrayBlockingQueue
- spring拦截器与filter的区别
- A20地址线