1060 Are They Equal (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>	
#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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值