PAT A1060 科學記數法經典例題(全string庫解決)

clipboard.png

挺操蛋的一道題,我他媽的都服了。。。出這道題我怕是斃了

首先題目裏就有幾個坑:
1.可能有前導零,比如說000.0001
2.可能有零,比如說000.0000000

哎,思路感覺最重要,對於字符串處理一定要有思路,知道先幹嘛,後幹嘛;

首先就要去除前導零,把他變成一個純淨的浮點數;

去除前導零,我們就可以進行分類討論,因爲必定會出現兩種情況:
1.第一位是小數點,此時該數爲小數;
2.第一位是數字,此時該數爲大於零的數;

對於第一種情況,我們應該注意e和位數的關係;
例如.0002,其e一定是符號位到第一位不爲零的數字的距離,也就是0.2*10^-3。
所以對於第一種情況,只需要尋找第一位不爲零的數字,過一位e--,從而使得得到純淨小數的時候,也能得到指數;

注意:兩種情況都是不含小數點的數,“0.”後面輸出的時候再加

對於第二種情況,我們應該先尋找小數點;
這裏e的記錄方式和第一種情況類似,每過一位,e++;
比如44.2,我們應該是0.442*10^2,而此時e過了兩位;
當我們找到小數點之後,就應該刪除小數點,使我們得到純淨的連續數字;

對於以上兩種情況,我們都得到了純淨的連續數字,也就是非小數,不包含小數點的數字,接下來就是對保留位數進行判斷;

對於一種情況,就是通過以上步驟,00.00,最後得到的序列爲空,此時e=0,作爲零的特殊情況;

後續就是對精度計算,並且對不足位進行補0操作;

例如現在得到了12,我們要求精度位4位,所以先建立一個空字符串s,遍歷的同時對精度位進行計算,當s="12"時,還差兩個精度位,所以補兩個0,輸出s="1200"

最後進行比較的時候就是對指數和保留部分比較,後續輸出的時候再s前加上“0.”輸出就行;

代碼如下所示:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
using std::vector;
int n;
string deal(string s,int& e){
    int k=0;
    while(s.length()>0&&s[0]=='0'){
        s.erase(s.begin());
        //去除前導零;
    }
    if(s[0]=='.'){
        //小於零的數字
        s.erase(s.begin());
        while(s.length()>0&&s[0]=='0'){
            s.erase(s.begin());
            //找到首位非零元素
            e--;
        }
    }else{
        while(k<s.length()&&s[k]!='.'){
            k++;
            //尋找小數點
            e++;
        }
        if(k<s.length()){
            //說明有小數點,進行刪除
            s.erase(s.begin()+k);
        }
    }
    if(s.length()==0){
        e=0;//取出前導零爲0說明實際爲0
    }
    int num=0;
    k=0;
    string res;
    while(num<n){
        if(k<s.length())
            //如果有數字存在
            res+=s[k++];
        else
            res+='0';
        num++;
    }
    return res;
}
int main(){
    string s1,s2,s3,s4;
    cin>>n>>s1>>s2;
    int e1=0,e2=0;
    s3=deal(s1,e1);
    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;
    }
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章