1060 Are They Equal 思路整理

 总思路是把两个数都变成科学计数法然后比较有效位和指数是否相同。

具体操作:

(1)先要去掉前导零。如果是“000000”这种情况,去完前导零后字符串就没了,这时候要让指数e为0

(2)此时可能字符串的第一位是小数点,这个时候把小数点去掉,然后找字符串中第一个不为零的字符所在的位置,并且把首个不为零的的字符前的所有零都去掉。另外每出现一个0,e--。注意有可能字符串是000.00000的情况,如果是这种情况要让e为0

(3)此时字符串的第一位不是小数点而是一个非零数,去找小数点的位置然后去掉小数点,另外小数点前有几位数e就加几。

(4)此时声明一个string类型的变量ans,根据题目要求的位数把字符串中的字符导入ans,如果不够在ans后面添0,最后返回ans。

以上就是solve函数的思路。

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
/*去掉前导零
变为科学计数法 
*/ 
string solve(string s,int &e, int n)
{
	e = 0;
	string ans;
	while(s.size()>0&&s[0]=='0'){
		s.erase(s.begin());
	}
 	if(s.size()==0){//如果是00000 
 		e = 0;
 	}
	if(s[0]=='.'){
		s.erase(s.begin());
		//找到第一个非0的数
		while(s.size()>0&&s[0]=='0'){
			e--;
			s.erase(s.begin());
		} 
	}
	else{
		for(auto it=s.begin(); it!=s.end(); it++){
			if(*it=='.'){
				s.erase(it);
				break;
			} 
			e++;
		}
	}
	if(s.size()==0){
		e = 0;
	}
	for(int i=0; i<n; i++){
		if(i<s.size()){
			ans.push_back(s[i]);
		}
		else ans.push_back('0');
	}
	return ans;
}
int main()
{
	int n,e1,e2;
	string s1,s2;
	cin>>n>>s1>>s2;
	s1 = solve(s1,e1,n);
	s2 = solve(s2,e2,n);
	if(s1==s2&&e1==e2){
		printf("YES 0.");
		cout<<s1<<"*10^"<<e1;
	}
	else{
		printf("NO ");;
		cout<<"0."<<s1<<"*10^"<<e1<<" ";
		cout<<"0."<<s2<<"*10^"<<e2<<endl;
	}
	return 0;
}






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值