# String Manipulation# Math# Greedy

d561 - 被秒殺的四捨五入

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的小數進行四捨五入,並保留小數點以下兩位。輸入的小數範圍是 -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";
		}
	}
}

Discussion