d561 - 被秒殺的四捨五入
題目描述
題目要求將輸入的小數進行四捨五入,並保留小數點以下兩位。輸入的小數範圍是 -1 到 1,小數點以下最多有 100 位數。
解題思路
程式碼首先讀取輸入的字串。然後,將字串分割成整數部分和分數部分。接著,將分數部分擴展到三位數,並進行四捨五入。最後,根據四捨五入的結果,輸出格式化的結果。程式碼處理了多種特殊情況,例如負數、整數、以及四捨五入後需要進位的狀況。
複雜度分析
- 時間複雜度: O(100) (因為字串長度最多為 100)
- 空間複雜度: O(100) (儲存字串需要 O(100) 的空間)
程式碼
#include <iostream>
#include <string>
using namespace std;
int main(){
string a;
while(cin >> a){
int al=a.length(),i=0;
string b;
for(;i<al;i++){
if(a[i]=='.')break;
b+=a[i];
}
a+="000";
int x=0,t=0;
for(i++;t<3;i++,t++){
x*=10;
x+=a[i]-48;
}
if(x%10>4){
x+=10;
}
if(x>=1000||x==0){
int y=0,bl=b.length(),j=0;
bool ans=0;
if(b[0]=='-'){
j++;
ans=1;
}
for(;j<bl;j++){
y*=10;
y+=b[j]-48;
}
if(x>=1000)y++;
if(ans==1&&x!=0)cout << '-';
cout << y << '.' << "00\n";
}
else{
if(x<5&&b=="-0"){
cout << "0.00\n";
}
else if(x<100){
cout << b << ".0" << x/10 << "\n";
}
else
cout << b << "." << x/10 << "\n";
}
}
}