1060 Are They Equal (25分)【string】

news/2024/7/7 12:36:35

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

题目大意:

给出两个数,问将它们写成保留N位小数的科学计数法后是否相等。如果相等,则输出“YES”,并给出该转换结果;如果不等,则输出“NO”,并给出两个数的转换结果。

解题思路:

题目要求我们将两个数改写为科学计数法的形式,然后判断它们是否相等。而科学计数法的写法一定是如下格式:0.a_1a_2a_3...\times10^e,因此我们只需获取到科学计数法的有效位部分a_1a_2a_3与指数e,即可判定两个数在科学计数法形式下是否相等。

首先,我们分两种情况考虑1、是小数点前面为0;2、是小数点前面不为0。

对于情况1由于小数点后面还有可能有多个0,因此我们的有效位是小数点后第一个非0的数开始取3位数,指数则是小数点与该非0位之间的位数的相反数。而对于情况2,有效位很显然就是从第一位数开始3位数,指数则是小数点前的数位的总位数(但是这里需要注意一个陷阱,就是在数据之前可能还会有若干个0,例如000.001或000111.1,因此需要消除前导0)。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;

int n;

string fun(string str, int &e)    //返回有效位以及指数
{
	int k = 0;
	while (str.length() > 0 && str[0] == '0')
		str.erase(str.begin());                          //去除前导0
	if (str[0] == '.')                      //若是小数点则去掉小数点
	{
		str.erase(str.begin());
		while (str.length() > 0 && str[0] == '0')
		{
			str.erase(str.begin());                           //去掉小数点后非零位前的所有0
			e--;                                                      //指数减1
		}
	}
	else                                     //否则去掉前导0后不是小数点,则找到后面的小数点删除
	{
		while (k < str.length() && str[k] != '.')               //寻找小数点
		{
			k++;
			e++;
		}
		if (k < str.length())
		{
			str.erase(str.begin() + k);
		}
	}
	if (str.length() == 0)   //如果去除前导0后s的长度变为0,则说明这个数是0
	{
		e = 0;
	}
	int num = 0;
	k = 0;
	string res;
	while (num < n)
	{
		if (k < str.length())
			res += str[k++];
		else res += '0';
		num++;
	}
	return res;
}

int main()
{
	string s1, s2, s3, s4;
	cin >> n >> s1 >> s2;
	int e1 = 0, e2 = 0;
	s3 = fun(s1, e1);
	s4 = fun(s2, e2);
	if (s3 == s4&&e1 == e2)
	{
		cout << "YES 0." << s3 << "*10^" << e1 << endl;
	}
	else
	{
		cout << "NO 0." << s3 << "*10^" << e1 << " 0." << s4 << "*10^" << e2 << endl;
	}
	return 0;
}

 


http://www.niftyadmin.cn/n/4610377.html

相关文章

Node.js中的HTTPS示例

需要openssl的支持&#xff0c; openssl本身不提供windows的安装程序&#xff0c;可以按照如下的步骤进行安装&#xff1a; (参考https://conetrix.com/Blog/how-to-install-openssl-on-windows-7&#xff0c;并复制到下面) How-to Install OpenSSL on Windows 7 Download and …

动态规划专题详细总结(常见简单类型)

什么是动态规划 动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想。简单来说&#xff0c;动态规划将一个复杂的问题分解为若干个子问题&#xff0c;通过综合子问题的最优解来得到原问题的最优解。需要注意的是&#xff0c;动态规划会将每个求解过的子…

MySQL数据库无法启动的简单排错

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1406691 一般来说有经验的管理员在部署操作系统时通常会将操作系统本身与应用软件分离&#xff0c;将两…

7-43 字符串关键字的散列映射 (25 分)

7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P&#xff0c;用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数&#xff0c;每个字符占5位&#xff1b;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串…

Node.js 开发相关

2019独角兽企业重金招聘Python工程师标准>>> 全局安装默认存放路径npm install express -g C:\Users\Administrator\AppData\Roaming\npm转载于:https://my.oschina.net/u/1179666/blog/1511162

P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles【DP、数塔问题】

题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从 7 \to 3 \to 8 \to 7 \to …

Linux大文件分割split和合并cat使用方法

本文主要介绍linux下两个命令&#xff1a;split和cat。其中&#xff0c;相信大家都熟悉cat命令&#xff0c;一般用来查看一个文件的内容&#xff0c;但是它还其它的功能&#xff0c;比如这里要介绍的文件合并功能&#xff0c;它可把多个文件内容合并到一个文件中。从split词义不…

RxJava 机制

韩梦飞沙 韩亚飞 313134555qq.com yue31313 han_meng_fei_sha rxjava 是 以 响应式 编程思想 编程的 java类库转载于:https://www.cnblogs.com/yue31313/p/7375552.html