A41125. 实数加法
填空题
中等
知识点
题目描述
实数加法
题目描述
求2个实数相加的和。
输入输出中出现的实数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数;对于小数部分,至少有一位且最后一位Qj不等于0。
输入格式
2行,分别是两个加数。每个加数不超过100个字符。
输出格式
一行输出是相应的和。数据保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111样例输出
0.222222222222222222222222222222参考答案
#include <iostream>
#include <cstring>
using namespace std;//n代表整数部分,m代表小数部分
int a_n[101],b_n[101],a_m[101],b_m[101],n[101],m[101];
char a[101],b[101];//ab分别代表不同的两数
int main(){
cin>>a>>b;
int a_len=strlen(a);
int b_len=strlen(b);
int a_n_len=0,b_n_len=0,a_m_len=0,b_m_len=0;
bool flag=true;
for (int i = 0; i < a_len; ++i) {//分解
if(a[i]=='.'){
flag=false;
continue;
}
flag?a_n[a_n_len++]=a[i]-'0':a_m[a_m_len++]=a[i]-'0';
}
int a_nn[101];//整数倒序,便于计算
memset(a_nn,0, sizeof(a_nn));
for (int i = 0; i < a_n_len; ++i) {
a_nn[i]=a_n[a_n_len-1-i];
}
flag= true;//b
for (int i = 0; i < b_len; ++i) {
if(b[i]=='.'){
flag=false;
continue;
}
flag?b_n[b_n_len++]=b[i]-'0':b_m[b_m_len++]=b[i]-'0';
}
int b_nn[101];
memset(b_nn,0, sizeof(b_nn));
for (int i = 0; i < b_n_len; ++i) {
b_nn[i]=b_n[b_n_len-1-i];
}
int jw=0;//进位
int max_m=(a_m_len>b_m_len?a_m_len:b_m_len);//先开始小数
for (int i = max_m; i >= 0; --i) {
m[i]=a_m[i]+b_m[i]+jw;
jw=m[i]/10;
m[i]%=10;
}
int max_n=a_n_len>b_n_len?a_n_len:b_n_len;//整数
for (int i = 0; i < max_n; ++i) {
n[i]=a_nn[i]+b_nn[i]+jw;
jw=n[i]/10;
n[i]%=10;
}
if(jw>0){//进位
max_n+=1;
n[max_n-1]=jw;
}
for (int i = max_n-1; i >=0 ; --i) {//输出
cout<<n[i];
}
cout<<".";
while(m[max_m-1]==0){//去0
max_m--;
}
for (int i = 0; i < max_m; ++i) {
cout<<m[i];
}
}
上一题
下一题