当前位置: 代码迷 >> 综合 >> PTA甲级 1060 Are They Equal (25分)
  详细解决方案

PTA甲级 1060 Are They Equal (25分)

热度:64   发布时间:2024-02-24 13:18:27.0

文章目录

    • 题目原文
      • 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;
}

柳神的思路:

分析:

  1. cnta 和 cntb 通过扫描字符串得到小数点所在的下标(初始化cnta cntb为字符串长度,即下标为strlen(str))

  2. 考虑到可能前面有多余的零,用 p 和 q 通过扫描字符串使 p q 开始于第一个非0(且非小数点)处的下标

  3. 如果cnta >= p ,说明小数点在第一个开始的非0数的下标的右边,那么科学计数法的指数为cnta – p ; 否则应该为cnta – p + 1; 字符串b同理。

  4. 如果 p 和 q 等于字符串长度, 说明字符串是 0, 此时直接把 cnta(或者cntb)置为0,因为对于0来说乘以几次方都是相等的,如果不置为0可能会出现两个0比较导致判断为它们不相等

  5. indexa = 0开始给新的A数组赋值,共赋值n位除去小数点外的正常数字,从p的下标开始。如果p大于等于strlen,说明字符串遍历完毕后依旧没能满足需要的位数,此时需要在A数组后面补上0直到满足n位数字。indexb同理,产生新的B数组

  6. 判断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;
}

如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗

相信我,你也能变成光.

在这里插入图片描述

如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.

  相关解决方案