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.d1...dN*10^k" (d1>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<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; // 0000.0012 0123.34
char str1[], str2[];
int process(char s[], int len){
int i,j, exp;
for(i = ; s[i] != '\0' && s[i] == ''; i++); //去除前导0
if(s[i] != '\0'){
for(j = ; s[j + i] != '\0'; j++)
s[j] = s[j + i];
s[j] = '\0';
}else{
for(int k = ; k < len; k++)
s[k] = '';
s[len] = '\0';
return ;
}
if(s[] == '.'){ //.0012
for(i = ; s[i] != '\0' && s[i] == ''; i++);
if(s[i] == '\0'){
exp = ;
s[] = '';
}else{
exp = i - ;
exp *= -;
for(j = ; s[i + j] != '\0'; j++)
s[j] = s[j + i];
s[j] = '\0';
}
}else{ //123.456
for(i = ; s[i] != '\0' && s[i] != '.'; i++);
if(s[i] == '\0'){
exp = i;
}else{
exp = i;
for(; s[i + ] != '\0'; i++)
s[i] = s[i + ];
s[i] = '\0';
}
}
for(j = ; s[j] != '\0'; j++);
while(j < len){
s[j++] = '';
}
s[len] = '\0';
return exp;
}
int main(){
int N, exp1, exp2;
scanf("%d %s %s", &N, str1, str2);
exp1 = process(str1, N);
exp2 = process(str2, N);
int tag = ;
for(int i = ; str1[i] != '\0'; i++)
if(str1[i] != str2[i]){
tag = ;
break;
}
if(tag == && exp1 == exp2){
printf("YES 0.%s*10^%d", str1, exp1);
}else{
printf("NO 0.%s*10^%d 0.%s*10^%d", str1, exp1, str2, exp2);
}
cin >> N;
return ;
}
总结:
1、题意:将给出的两个数字变成保留指定位小数的科学计数法的数字,之后看其是否相等。
2、主要分为两种数字,大于1和小于1(0.000123, 1234.5678),其次要注意有0000123的情况出现,要先去除前导0.
3、主要要做的就是想办法求出不带小数点的且符合要求的底数。
4、测试样例: 3 0.0 0
输出:YES 0.000*10^0