总结:
1.对于这类题,首先要弄清楚题意,找到一个合适的方法才会事半功倍,否则就会像我第一次写了一百多行代码发现只过了3个测试点,还有这类问题思考问题一定要全面,否则很容易出错
2.这道题的坑主要是在:0.00000123,000123,000.0000,0000这几个数据上,去除第一位位0但是第二位不为小数点的0
然后分0.12345(小数部分为0)和123.12344(都不为0)和1234(没有小数部分)讨论
3.多多重复---%¥#@
1060 Are They Equal (25)(25 分)
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.
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 10^100^, 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.120*10^3 0.128*10^3
代码:
#include<iostream>
#include<string>
using namespace std;
int a1 = 0;
int n;
string opp(string s)
{
//获取整数部分和小数部分
int k = s.find('.');
if (k == string::npos){ //没有小数部分
a1 = s.length();
if (s.length() > n)s.erase(n, s.length() - n);
else if (s.length() < n){ string sp(n - s.length(), '0'); s += sp; }
s = "0." + s;
}
else{ //有小数部分和整数部分
if (s[0] == '0'){
int ft = 2; int ci = 0;
for (int i = 2; i < s.length(); i++)
{
if (s[i] == '0')ci--;
else break;
}
if (-ci == s.length() - 2)ci = 0;
else
a1 = ci;
s = s.substr(2 - ci, s.length() - 2 + ci);
if (s.length()>n){ s.erase(n, s.length() - n); s = "0." + s; }
else if (s.length() <= n){
string sp(n - s.length(), '0'); s += sp;
s = "0." + s;
}
}
else{
a1 = k; s.erase(k, 1);
if (s.length()>n)s.erase(n, s.length() - n);
else if (s.length() < n){
string sp(n - s.length(), '0'); s += sp;
}
s = "0." + s;
}
}
return s;
}
int main()
{
string s1, s2;
cin >> n >> s1 >> s2;
while (s1[0] == '0'&&s1[1]!='.')s1.erase(0,1);
while (s2[0] == '0'&&s2[1]!='.')s2.erase(0, 1);
s1 = opp(s1); string sp1 = "*10^"; string sp2 = to_string(a1);
s2 = opp(s2); string sp3 = to_string(a1);
int flag = 1;
for (int i = 0; i < s1.length();i++)
{
if (s1[i] != s2[i]){ flag = 0; break; }
}
if (flag == 0||sp2!=sp3){ printf("NO "); cout << s1 + sp1 + sp2 << " " << s2 + sp1 + sp3; }
else{
printf("YES "); cout << s1 + sp1 + sp2;
}
return 0;
}