题解 | #浮点数加法#

浮点数加法

http://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8

结构体法,整整齐齐的

#include<iostream>
#include<string>
#include<cstring>
int CF=0;								//小数->整数进位标志 
using namespace std;
struct number{	//数字结构体,整数和小数长度看似没必要但还是有点用的 
	string all;							//每个数字的全部字符 
	string zheng;						//整数部分 
	string xiao;						//小数部分 
	int zhenglen;						//整数长度 
	int xiaolen;						//小数长度 
	int pos;							//小数点位置 
};
string zplus(string a,string b){		//整数部分相加 
	int cf=0;							//整数部分进位标志					
	for(int i=a.length()-1;i>=0;i--){	//从低位逐位相加,注意进位标志CF、cf	
		if((a[i]-'0')+(b[i]-'0')+cf+CF>=10){
			a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+CF-10+'0');
			cf=1;
		} 
		else if((a[i]-'0')+(b[i]-'0')+cf<10){
			a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+CF+'0');
			cf=0;
		}
		if(i==a.length()-1) CF=0;		//最低位相加后,就不用考虑小数整数进位 
	}
	if(cf==1) a.insert(0,"1");			//最高位相加后,若还有进位 
	return a;
}
string xplus(string a,string b){		//小数部分相加,基本相同 
	int cf=0;
	for(int i=a.length()-1;i>=0;i--){
		if((a[i]-'0')+(b[i]-'0')+cf>=10){
			a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf-10+'0');
			cf=1; 
		} 
		else if((a[i]-'0')+(b[i]-'0')+cf<10){
			a[i]=(char)((a[i]-'0')+(b[i]-'0')+cf+'0');
			cf=0;
		}
	}
	if(cf==1) CF=1;						//如果十分位相加后有进位 
	return a;
}
int main(){
	number a,b,test;					//test方便每一组数据结束后清空a和b 
	while(getline(cin,a.all)){			
		getline(cin,b.all);
		a.pos=a.all.find('.');			//下面一长串都是初始化a和b 
		b.pos=b.all.find('.');
		a.zheng.insert(0,a.all.substr(0,a.pos));
		b.zheng.insert(0,b.all.substr(0,b.pos));
		a.xiao.insert(0,a.all.substr(a.pos+1));
		b.xiao.insert(0,b.all.substr(b.pos+1));
		a.zhenglen=a.zheng.length();
		b.zhenglen=b.zheng.length();
		a.xiaolen=a.xiao.length();
		b.xiaolen=b.xiao.length();
		if(a.zhenglen<b.zhenglen){		//a整数比b整数短,则,否则同理 
			for(int i=0;i<b.zhenglen-a.zhenglen;i++){
				a.zheng.insert(0,"0");
			}
		}
		else if(a.zhenglen>b.zhenglen){
			for(int i=0;i<a.zhenglen-b.zhenglen;i++){
				b.zheng.insert(0,"0");
			}
		}
		if(a.xiaolen<b.xiaolen){		//小数同理 
			for(int i=0;i<b.xiaolen-a.xiaolen;i++){
				a.xiao.insert(a.xiao.length(),"0");
			}
		}
		else if(a.xiaolen>b.xiaolen){
			for(int i=0;i<a.xiaolen-b.xiaolen;i++){
				b.xiao.insert(b.xiao.length(),"0");
			}
		}
		string p2=xplus(a.xiao,b.xiao);	//分别计算小数和整数并输出 
		string p1=zplus(a.zheng,b.zheng);
		cout<<p1<<'.'<<p2<<endl;
		a=test;						    //清空a和b 
		b=test;
	}
	return 0;
}
全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务