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

clipboard.png

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

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

哎,思路感受最重要,對於字符串處理必定要有思路,知道先幹嗎,後幹嗎;code

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

去除前導零,咱們就能夠進行分類討論,由於一定會出現兩種狀況:
1.第一位是小數點,此時該數爲小數;
2.第一位是數字,此時該數爲大於零的數;ci

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

注意:兩種狀況都是不含小數點的數,「0.」後面輸出的時候再加字符串處理

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

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

對於一種狀況,就是經過以上步驟,00.00,最後獲得的序列爲空,此時e=0,做爲零的特殊狀況;io

後續就是對精度計算,而且對不足位進行補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;
}
相關文章
相關標籤/搜索