1024 科學計數法 (20分)
題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則運算式 [+-][1-9].[0-9]+E[+-][0-9]+,即數字的整數部分只有 1 位,小數部分至少有 1 位,該數字及其指數部分的正負號即使對正數也必定明確給出,
現以科學計數法的格式給出實數 A,請撰寫程式按普通數字表示法輸出 A,并保證所有有效位都被保留,
輸入格式:
每個輸入包含 1 個測驗用例,即一個以科學計數法表示的實數 A,該數字的存盤長度不超過 9999 位元組,且其指數的絕對值不超過 9999,
輸出格式:
對每個測驗用例,在一行中按普通數字表示法輸出 A,并保證所有有效位都被保留,包括末尾的 0,
輸入樣例1
+1.23400E-03
輸出樣例1
0.00123400
輸入樣例2
-1.2E+10
輸出樣例2
-12000000000
我的理解
首先對輸入資料進行拆分,分為數字主體部分和指數浮動部分,以E為分解,
- 指數浮動部分的正負決定了小數點移動的方向,大小決定了小數點移動的位數,
- 小數點右移的程序中,如果移動的位數超過了小數部分的位數,則需要進行補0,左移的時候是至少需要補一位0的,因為整數部分只有1位,移動完小數點后需要注意最初的小數點要進行抹除,
- 數字的正負號在輸出時,+號省略,-號不能省略,
代碼段
#include <iostream>
using namespace std;
int main() {
string number;
cin >> number;
// 符號E之前的部分
string partA = number.substr(0, number.find('E'));
// 符號E之后的部分
string partB = number.substr(number.find('E') + 1, number.length());
// cout << partA << endl;
// cout << partB << endl;
// 數字部分正負符號
char partASign = partA[0];
// 指數部分正負符號
char partBSign = partB[0];
partA.erase(0, 1);
partB.erase(0, 1);
// 指數大小
int index = stoi(partB);
// 小數點需要進行移動
if (index != 0) {
// 小數點右移
if (partBSign == '+') {
// 如果小數部分位數大于指數,則進行小數點移動,無需補0
if (partA.length() - 2 > index) {
partA.insert(index + 2, ".");
// 小數部分位數小于指數,補0
} else if (partA.length() - 2 < index) {
for (int i = partA.length() - 2; i < index; i++) {
partA.append("0");
}
}
// 如果剛好小數部分位數等于指數,則直接抹除小數點即可
// 并且移動小數點后之前的小數點也要抹除
partA.erase(1, 1);
// 小數點左移
} else {
partA.erase(1, 1);
for (int i = 1; i < index; i++) {
partA.insert(0, "0");
}
partA.insert(0, "0.");
}
}
// 如果為+則不再輸出
if (partASign == '+') {
cout << partA << endl;
} else {
cout << partASign << partA << endl;
}
return 0;
}
更改程序
- 在本地通過樣例測驗之后,小心翼翼的去OJ,結果全部答案錯誤、、、,不小心沒有把中間的輸出陳述句刪掉,刪掉之后,完美AC、、、
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/98396.html
標籤:其他
上一篇:求 RTMP或RTSP 協議轉換成UDP 視頻流的方案
下一篇:怎么查看分公司的電腦是否關機
