d137 - 绝对值
題目描述
題目要求計算輸入數字的絕對值。輸入的數字可以是實數、虛數或複數。實數是整數,複數表示為 a+bi 的形式,其中 a 和 b 都是整數,i 是虛數單位。輸出結果需要保留三位小數。
解題思路
程式碼首先讀取輸入字串。然後,它解析字串以提取實部和虛部。解析過程中會處理正負號和 'i' 字符。最後,使用公式 sqrt(r*r + f*f) 計算複數的絕對值,其中 r 是實部,f 是虛部。計算結果使用 fixed 和 setprecision(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";
}
}