文章目录
-
- 题目原文
-
- Input Specification:
- Output Specification:
- Sample Input 1:
- Sample Output 1:
- Sample Input 2:
- Sample Output 2:
- 生词如下:
- 大意如下:
- 思路如下:
- 我的代码如下:
- 柳神的思路:
- 柳神的代码:
强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬
本文由参考于柳神博客写成
柳神的CSDN博客,这个可以搜索文章
柳神的个人博客,这个没有广告,但是不能搜索
PS 今天也要加油鸭
题目原文
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
生词如下:
chopping 就是切,消减,牛排的意思,是一个四级单词.
大意如下:
就是给你两个有意义的非负数.
然后让你比较他们的大小
数字的大小不超过10100.长度不超过100
用float long long int 啥的肯定是存储不了的呢.
所以,我们要使用.string
思路如下:
① 就是按照各种各样的方法比较.
② 这题的难点就在于小数有许多种类型的.就看你考虑问题是不是全面.
000.00 和 0.000 是一个数字.但是写法确不一样.
我的代码修修补补之后也AC了
我的代码如下:
#include<iostream>
#include<string>
using namespace std;
string Equal(string a, int N, int* index) {//如果是小数的话string result;result += "0.";//小数点 bool flag_radixs = false, eff_num = false;int i = 0;while (i < a.length()&&N>0) {if (!eff_num && !flag_radixs && a[i] != '0'&&a[i]!='.') {eff_num = true;N--;result += a[i];(*index)++;}else if (a[i]=='.') {flag_radixs = true;}//已经在小数点后了,但是还是0else if (flag_radixs &&!eff_num&& a[i] == '0') {(*index)--;}else if (flag_radixs && a[i] != '0') {result += a[i];N--;eff_num = true;}else if (flag_radixs && a[i] == '0'&&eff_num) {result += a[i];N--;}else if (eff_num) {N--;result += a[i];(*index)++;}++i;}while (i < a.length()) {if (!flag_radixs && a[i] != '.') (*index)++;else if (a[i] == '.') break;++i;}while (N > 0) {result += '0';N--;}if (!eff_num) (*index) = 0;return result;
}
int main(void) {int N = 0, isPositive = 0, index_a = 0, i, index_b = 0;string a, b, result;cin >> N >> a >> b;a = Equal(a, N, &index_a);b = Equal(b, N, &index_b);if (a == b && index_a == index_b) {cout << "YES " << a << "*10^" << index_a;}else {cout << "NO " << a << "*10^" << index_a << " " << b << "*10^" << index_b;}return 0;
}
柳神的思路:
分析:
-
cnta 和 cntb 通过扫描字符串得到小数点所在的下标(初始化cnta cntb为字符串长度,即下标为strlen(str))
-
考虑到可能前面有多余的零,用 p 和 q 通过扫描字符串使 p q 开始于第一个非0(且非小数点)处的下标
-
如果cnta >= p ,说明小数点在第一个开始的非0数的下标的右边,那么科学计数法的指数为cnta – p ; 否则应该为cnta – p + 1; 字符串b同理。
-
如果 p 和 q 等于字符串长度, 说明字符串是 0, 此时直接把 cnta(或者cntb)置为0,因为对于0来说乘以几次方都是相等的,如果不置为0可能会出现两个0比较导致判断为它们不相等
-
indexa = 0开始给新的A数组赋值,共赋值n位除去小数点外的正常数字,从p的下标开始。如果p大于等于strlen,说明字符串遍历完毕后依旧没能满足需要的位数,此时需要在A数组后面补上0直到满足n位数字。indexb同理,产生新的B数组
-
判断A和B是否相等,且cnta和cntb是否相等。如果相等,说明他们用科学计数法表示后是相同的,输出YES,否则输出NO,同时输出正确的科学计数法
柳神的代码:
#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;elsecnta = cnta - p + 1;if(cntb >= q)cntb = cntb - q;elsecntb = 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);elseprintf("NO 0.%s*10^%d 0.%s*10^%d" , A, cnta, B, cntb);return 0;
}
如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗
相信我,你也能变成光.
如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.