PAT 1060 Are They Equal (25分)

题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872

题目描述
If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered equal since they are both saved as 0.123×10^​5​​ with simple chopping. Now given the number of significant digits on a machine and two float numbers, you are supposed to tell if they are treated equal in that machine.

输入
Each input file contains one test case which gives three numbers N, A and B, where N (<100) is the number of significant digits, and A and B are the two float numbers to be compared. Each float number is non-negative, no greater than 10^​100​​ , and that its total digit number is less than 100.

输出
For each test case, print in a line YES if the two numbers are treated equal, and then the number in the standard form 0.d[1]…d[N]*10^k (d[1]>0 unless the number is 0); or NO if they are not treated equal, and then the two numbers in their standard form. All the terms must be separated by a space, with no extra space at the end of a line.

Note: Simple chopping is assumed without rounding.

样例输入
3 12300 12358.9

样例输出
YES 0.123*10^5

代码

#include<iostream>
#include<string>
using namespace std;

int n;
string deal(string s, int &e) {
	int k = 0;
	while(s.length() > 0 && s[0] == '0')
		s.erase(s.begin());
	if(s[0] == '.') {
		s.erase(s.begin());
		while(s.length() > 0 && s[0] == '0'){
			s.erase(s.begin());
			e--;
		}
	}
	else {
		while(k < s.length() && s[k] != '.') {
			k++;
			e++;
		}
		if(k < s.length())
			s.erase(s.begin() + k);
	}
	if(s.length() == 0)
		e = 0;
	int num = 0;
	k = 0;
	string res;
	while(num < n) {
		if(k < s.length())
			res += s[k++];
		else
			res += '0';
		num++;
	}
	return res;
}

int main() {
	string s1, s2, s3, s4;
	cin >> n >> s1 >> s2;
	int e1 = 0, e2 = 0;
	s3 = deal(s1, e1);
	s4 = deal(s2, e2);
	if(s3 == s4 && e1 == e2)
		cout<<"YES 0."<<s3<<"*10^"<<e1<<endl;
	else
		cout<<"NO 0."<<s3<<"*10^"<<e1<<" 0."<<s4<<"*10^"<<e2<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值