1060. Are They Equal (25)-字符串处理,科学计数法

来源:互联网 发布:创可贴的网络意思 编辑:程序博客网 时间:2024/05/22 15:48

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.d1…dN*10^k” (d1>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

#include<iostream>#include<string>using namespace std;int n; string deal(string s,int& e){//e代表指数部分     while(s.length()>0&&s[0]=='0'){//去掉s的前导零         s.erase(s.begin());    }    if(s[0]=='.'){//该数大于0         s.erase(s.begin());//去掉小数点         while(s.length()>0&&s[0]=='0'){            s.erase(s.begin());            e--;        }    }else{//该数小于0         int t=0;        while(t<s.length()&&s[t]!='.'){//寻找小数点             t++;            e++;        }        if(t<s.length()){//while结束后k<s.length(),说明遇到了小数点             s.erase(s.begin()+t);//去除小数点         }       }    if(s.length()==0){//该数等于0     //若遗忘此步,最后一个测试点错误         e=0;    }    string res;    for(int i=0,j=0;i<n;i++){        if(j<s.length()) res+=s[j++];        else res+='0';    }     return res;}int main(){    string s1,s2,s3,s4;    cin>>n>>s1>>s2;    int e1=0,e2=0;    s3=deal(s1,e1);//s3,e1为s1转换为科学计数法后的主体部分和小数部分     s4=deal(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;}
0 0