PAT甲题题解-1060. Are They Equal (25)-字符串处理(科学计数法)

又是一道字符串处理的题目。。。

题意:给出两个浮点数,询问它们保留n位小数的科学计数法(0.xxx*10^x)是否相等。根据是和否输出相应答案。

思路:
先分别将两个浮点数转换成相应的科学计数法的格式
1.point为小数点的索引,初始化为字符串的长度len
2.not0位第一个非0的数字的索引,初始化为len
如果not0为len,表明该浮点数为0,特殊处理,形式为0.0..0*10^0
否则根据point和not0的大小,计算相应的指数。
接着便是从str的not0开始,给ans赋值,共n位不包括小数点的数字,不足的最后补0即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=200;
char s1[maxn],s2[maxn];
int n;

void solve(char*str,char*ans,int n,int &e){
    int len=strlen(str);
    int point=len; //小数点的索引
    for(int i=0;i<len;i++){
        if(str[i]=='.'){
            point=i;
            break;
        }
    }
    int not0=len; //第一个非0的索引
    for(int i=0;i<len;i++){
        if(str[i]!='.' && str[i]!='0'){
            not0=i;
            break;
        }
    }
    //数字为0
    if(not0==len){
        e=0;
        ans[0]='0';
        ans[1]='.';
        for(int i=0;i<n;i++)
            ans[2+i]='0';
        ans[n+2]='\0';
    }
    else{
        e=point>not0?point-not0:point-not0+1; //指数
        ans[0]='0';
        ans[1]='.';
        for(int i=0,j=not0;i<n;i++,j++){
            if(j<len){
                if(str[j]!='.')
                    ans[2+i]=str[j];
                else
                    i--;
            }
            else
                ans[2+i]='0';
        }
        ans[2+n]='\0';
    }
}
int main()
{
    scanf("%d %s %s",&n,s1,s2);
    char ans1[maxn],ans2[maxn];
    int e1,e2;
    solve(s1,ans1,n,e1);
    solve(s2,ans2,n,e2);
    if(strcmp(ans1,ans2)==0 && e1==e2){
        printf("YES ");
        printf("%s*10^%d\n",ans1,e1);
    }
    else{
        printf("NO ");
        printf("%s*10^%d %s*10^%d\n",ans1,e1,ans2,e2);
    }
    return 0;
}
View Code

 

posted @ 2017-03-05 12:06  辰曦~文若  阅读(289)  评论(0编辑  收藏  举报