挺操蛋的一道題,我他媽的都服了。。。出這道題我怕是斃了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; }