天天看点

*PAT_甲级_1060 Are They Equal (25分) (C++)【字符串处理/科学计数法】

目录

​​1,题目描述​​

​​题目大意​​

​​2,思路​​

​​数据结构​​

​​算法​​

​​3,AC代码​​

​​4,解题过程​​

​​第一搏​​

​​第二搏​​

1,题目描述

*PAT_甲级_1060 Are They Equal (25分) (C++)【字符串处理/科学计数法】

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后,两数是否相等。

2,思路

参考这位大神的代码!​​@日沉云起【pat甲级1060. Are They Equal (25) 】​​

代码简洁,清晰易懂,注释详细,妙不可言!膜了!

(这一题看上去很简单,实际上繁琐之极。。。抛出几个例子就知道了)

//test1
99 0.00 0.000
//result
YES 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*10^0

//test2
3 0.00123 0.00345
//result
NO 0.123*10^-2 0.345*10^-2

//test3
6 123 234
//result
NO 0.123000*10^3 0.234000*10^3      

但是,理清思路后就简单多了

数据结构

将结果分为两部分ans和exp:

  • string ans:存放0.之后需要输出的部分,比如5 123 ,ans1= 12300(后两个0是为了补全5位);
  • int exp:存放指数 还按上述例子,exp此时应为3;

算法

num为输入的数字(string类型)

  1. point标记小数点位置(初始时为num.size()),index标记第一个不为0的数字的位置(初始为-1)。根据point和index可以计算exp;
  2. 遍历一遍字符串,确定point和index的值,并将第一个不为0的数字以及后面的一共N个数字,存入ans中;
  3. 若ans.size() < N,ans+='0'(将ans中不满N个数字的部分,补0);【ans部分计算完成】
  4. 若index == -1,exp为0;
  5. 若point-index小于0,exp = point-index+1;否则exp = point-index;【exp部分计算完成】

3,AC代码

#include<iostream>
using namespace std;

int N;                              //保留的数字位数

void analyse(const string &num, string &ans, int &exp){
    int point = num.size();         //小数点位置 初始为末位
    int index = -1;                 //标记第一个不为0的位置
    for(int i = 0; i < num.size(); i++){
        if(num[i] == '.')           //遇到小数点 重新标记小数点位置
            point = i;
        else if(index == -1 && num[i] != '0'){//找到第一个不为0的数
            index = i;
            ans += num[i];
        }
        else if(index != -1 && ans.size() < N)//将第一个非0的字符之后的N个数字保存起来
            ans += num[i];
    }

    while(ans.size() < N)           //当ans不够N位时 不断补0
        ans += '0';

    exp = point - index;            //指数即小数点位置减去第一个不为0的数字的位置 eg.123.4 exp=3-0=3
    exp = exp < 0 ? exp + 1 : exp;  //若exp小于0 需要加1 eg.0.00123 exp=1-4+1=-2

    if(index == -1)                 //未找到不为0的数 此时ans中均为0
        exp = 0;

}

int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    string a, b, a1, b1;
    int expA, expB;
    cin>>N>>a>>b;

    analyse(a, a1, expA);
    analyse(b, b1, expB);

    if(a1 == b1 && expA == expB){
        cout<<"YES 0."<<a1<<"*10^"<<expA;
    }else{
        cout<<"NO 0."<<a1<<"*10^"<<expA<<" 0."<<b1<<"*10^"<<expB;
    }

    return 0;
}      

4,解题过程

第一搏

由于数据的结构处理没有想好,很多细节都很难完善。。。

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<math.h>
#include<queue>
using namespace std;


int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    int N;
    cin>>N;

    char num1[101], num2[101];//以字符形式存储数字
    int index1 = -1, index2 = -1;//标记小数点位置

    fill(num1, num1 + 101, '0');
    fill(num2, num2 + 101, '0');

    char c;
    scanf(" %c", &c);
    //printf("%c", c);
    int i;
    for(i = 0; c != ' ' && i <= 100; i++){
        if(c == '.') index1 = i--;//回退一位
        else num1[i] = c;
        scanf("%c", &c);
    }
    if(index1 == -1) index1 = i;

    scanf("%c", &c);
    for(i = 0; c != '\n' && i <= 100; i++){
        if(c == '.') index2 = i--;//回退一位
        else num2[i] = c;
        scanf("%c", &c);
    }
    if(index2 == -1) index2 = i;

    int flag = 1;
    if(index1 != index2){
        flag = 0;
    }else{
        for(int j = 0; j < N; j++){
            if(num1[j] != num2[j]){
                flag = 0;
                break;
            }
        }
    }

    if(flag == 0){
        printf("NO 0.");
        for(int j = 0; j < N; j++)
            printf("%c", num1[j]);
        printf("*10^%d 0.", index1);
        for(int j = 0; j < N; j++)
            printf("%c", num2[j]);
        printf("*10^%d", index2);
    }else{
        printf("YES 0.");
        for(int j = 0; j < N; j++)
            printf("%c", num1[j]);
        printf("*10^%d", index1);
    }
    return 0;
}      
*PAT_甲级_1060 Are They Equal (25分) (C++)【字符串处理/科学计数法】

第二搏

继续阅读