挺操蛋的一道題,我他媽的都服了。。。出這道題我怕是斃了
首先題目裏就有幾個坑:
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;
}