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.120*10^3 0.128*10^3
吾代码:
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;
void find_position(string s,int &pos,int &non_negative_pos)
{
int len = s.length();
bool int_float_flag = false,non_nagetiveOK=false;
for (int i = 0; i <= len; i++)
{
if ((s[i] == '.' &&i != len) || (s[i] != '.'&& i == len &&int_float_flag==false))
{
int_float_flag = true;
pos = i + 1;
}
if (s[i] != '0'&&s[i] != '.'&&non_nagetiveOK==false)
{
non_nagetiveOK = true;
non_negative_pos = i + 1;
}
}
}
bool isZero(string s)
{
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '0' || s[i] == '.')
{
}
else
{
return false;
break;
}
}
return true;
}
void cut_zero(string &s) //第一步处理 去前导零
{
int i=0;
if (isZero(s))
{
s = "0";
return ;
}
for ( i = 0; i < s.length(); i++)
{
if (s[i]=='.')
{
break;
}
}
if (i==s.length()||i>1) //整数
{
while (s[0] == '0')
{
s.erase(s.begin());
}
}
}
string final_pro(string &s, int n, int str_point_pos) //得到有效数
{
if (s[str_point_pos-1]=='.')
{
s.erase(s.begin()+str_point_pos-1);//先清除小数点 整数不清除 会出错
}
//再清除 零 但是先排除s="0" 这种情况
if (s.length()>1)
{
while (s[0] == '0')
{
s.erase(s.begin());
}
}
if (s.length() > n) //只要n位 去掉多余的位数
{
s.erase(s.begin() + n, s.end());
}
return s;
}
void print(string str, int str_len, int n, int str_point_pos,
int str_non_negative_pos)
{
cout << "0.";
if (n >= str_len) //有效数位数不足要求的位数n 要右边补0
{
cout << left << setw(n) << setfill('0') << str;
if (str_point_pos < str_non_negative_pos)
{
cout << "*10^" << str_point_pos - str_non_negative_pos + 1;
}
else
{
cout << "*10^" << str_point_pos - str_non_negative_pos;
}
}
else
{
cout << str << "*10^" << str_point_pos-1;
}
}
int main()
{//0.00000000000000001的情况处理呢?
//freopen("in.txt", "r", stdin);
/*freopen("out.txt", "w", stdout);*/
string str1, str2;
int n, str1_point_pos=0, str2_point_pos=0,
str1_non_negative_pos,
str2_non_negative_pos;
cin >> n >> str1 >> str2;
//string s1 = str1; //因为0.0001这种情况需要原始字符串的长度
//string s2 = str2;
cut_zero(str1);
cut_zero(str2);
//找到小数点和first非零的位置str1_sign
find_position(str1, str1_point_pos, str1_non_negative_pos);
find_position(str2, str2_point_pos, str2_non_negative_pos);
/*int str1_sig_point_pos = 0, str1_sig_non_negative_pos = 0;
int str2_sig_point_pos = 0, str2_sig_non_negative_pos = 0;
find_position(str1, str1_sig_point_pos, str1_sig_non_negative_pos );
find_position(str2, str2_sig_point_pos, str2_sig_non_negative_pos);*/
string str1_sign = final_pro(str1, n, str1_point_pos);//准备输出格式 小数点及之后去掉
string str2_sign = final_pro(str2, n, str2_point_pos);//即有效数
int str1_len = str1_sign.length(), str2_len = str2_sign.length();
if ((str1_sign == str2_sign)&&(str1_point_pos==str2_point_pos)
&&(str1_non_negative_pos==str2_non_negative_pos))
{
cout << "YES ";
print(str1_sign, str1_len, n, str1_point_pos, str1_non_negative_pos);
}
else
{
cout << "NO ";
print(str1_sign, str1_len, n, str1_point_pos, str1_non_negative_pos);
cout << " ";
print(str2_sign, str2_len, n, str2_point_pos, str2_non_negative_pos);
}
//string s = "pyh";
//cout << right << setw(10)<<setfill('0')<<s;
//fclose(stdin);
/*fclose(stdout);*/
return 0;
}
liuchuo代码简单有效:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n, p = 0, q = 0;
char a[10000], b[10000], A[10000], B[10000];
scanf("%d%s%s", &n, a, b);
int cnta = strlen(a), cntb = strlen(b);
for(int i = 0; i < strlen(a); i++) {
if(a[i] == '.') {
cnta = i;
break;
}
}
for(int i = 0; i < strlen(b); i++) {
if(b[i] == '.') {
cntb = i;
break;
}
}
int indexa = 0, indexb = 0;
while(a[p] == '0' || a[p] == '.') p++;
while(b[q] == '0' || b[q] == '.') q++;
if(cnta >= p)
cnta = cnta - p;
else
cnta = cnta - p + 1;
if(cntb >= q)
cntb = cntb - q;
else
cntb = cntb - q + 1;
if(p == strlen(a))
cnta = 0;
if(q == strlen(b))
cntb = 0;
while(indexa < n) {
if(a[p] != '.' && p < strlen(a))
A[indexa++] = a[p];
else if(p >= strlen(a))
A[indexa++] = '0';
p++;
}
while(indexb < n) {
if(b[q] != '.' && q < strlen(b))
B[indexb++] = b[q];
else if(q >= strlen(b))
B[indexb++] = '0';
q++;
}
if(strcmp(A, B) == 0 && cnta == cntb)
printf("YES 0.%s*10^%d", A, cnta);
else
printf("NO 0.%s*10^%d 0.%s*10^%d" , A, cnta, B, cntb);
return 0;
}