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×105 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.
Input Specification:
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 10100, and that its total digit number is less than 100.
Output Specification:
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.
Sample Input 1:
3 12300 12358.9
Sample Output 1:
YES 0.123*10^5
Sample Input 2:
3 120 128
Sample Output 2:
NO 0.12010^3 0.12810^3
这个题大意很好理解,但是有很多坑点,比如所有0的指数都是0,即0.00……0*10^0,前缀0忽略等等。这推荐一个测试数据
https://blog.csdn.net/qq_39117553/article/details/104914126
我自己用一个结构体分别记录 去除前缀0的数 和指数,之后比较,得出结果。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Num {
vector<int> ratio;
int power;
};
Num n1, n2;
int n;
Num read() {
string str;
Num temp;
cin >> str;
int k = 0;
temp.power = str.length();
bool f = true;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '.') {
temp.power = k;
continue;
}
else if (f == true && str[i] == '0') {
temp.power--;
continue;
}
if (str[i] != '0' || f == false) {
k++;
temp.ratio.push_back(str[i] - '0');
f = false;
}
}
if (f == true) temp.power = 0;
if (temp.power < n) {
for (int i = 0; i < n-temp.power; i++) {
temp.ratio.push_back(0);
}
}
return temp;
}
int main() {
bool f = true;
cin >> n;
n1=read();
n2=read();
for (int i = 0; i < n; i++) {
if (n1.ratio[i] != n2.ratio[i]) {
f = false;
break;
}
}
if (n1.power != n2.power) f = false;
if (f == true) {
cout << "YES 0.";
for (int i = 0; i < n; i++)
cout << n1.ratio[i];
cout << "*10^" << n1.power;
}
else {
cout << "NO 0.";
for (int i = 0; i < n; i++)
cout << n1.ratio[i];
cout << "*10^"<<n1.power<<" 0.";
for (int i = 0; i < n; i++)
cout << n2.ratio[i];
cout << "*10^" << n2.power;
}
return 0;
}
欢迎指导和交流!