# String Parsing# Math# Complex Numbers

d137 - 绝对值

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算輸入數字的絕對值。輸入的數字可以是實數、虛數或複數。實數是整數,複數表示為 a+bi 的形式,其中 a 和 b 都是整數,i 是虛數單位。輸出結果需要保留三位小數。

解題思路

程式碼首先讀取輸入字串。然後,它解析字串以提取實部和虛部。解析過程中會處理正負號和 'i' 字符。最後,使用公式 sqrt(r*r + f*f) 計算複數的絕對值,其中 r 是實部,f 是虛部。計算結果使用 fixedsetprecision(3) 格式化為保留三位小數的浮點數,並輸出。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為需要遍歷字串來解析數字。
  • 空間複雜度: O(1),因為使用的額外空間是固定的,不隨輸入大小變化。

程式碼

#include <iostream>
#include <cmath> 
#include <iomanip>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	string a;
	while(getline(cin,a)){
		int al=a.length(),it=0;
		double r=0,f=0,rf=1,ff=1;
		//-1 1 -i i -2i 2i ; -1+i 1+i -1+2i 1+2i -1-i 1-i -1-2i 1-2i
		if(a[it]=='+')++it;
		else if(a[it]=='-'){
			ff=-1;
			++it;
		}
		for(;it<al;++it){
			if(a[it]>='0'&&a[it]<='9'){
				f*=10;
				f+=a[it]-'0';
			}
			else if(a[it]=='+'||a[it]=='-'){
				r=f;
				rf=ff;
				f=0;
				(a[it]=='-')?ff=-1:ff=1;
			}
			else if(a[it]=='i')
				if(f==0)f=1;
		}
		r*=rf;
		f*=ff;
		cout << fixed << setprecision(3) << sqrt(r*r+f*f) << "\n";
	}
}

Discussion