b581 - 一串加
題目描述
題目要求讀取多組測試資料,每組資料包含一行由空格分隔的整數,包含正數和負數(負數前面會有一個減號)。程式需要計算每一行整數的和,並輸出結果。
解題思路
程式首先讀取測試資料的數量 n。然後,對於每一組測試資料,程式讀取一行字串 a,並初始化 ans (總和) 為 0 和 p (正負號標記) 為 0。程式迭代字串 a,如果遇到減號,則將 p 設為 1,表示後面的數字是負數。然後,程式從當前位置開始讀取數字,直到遇到空格。讀取的數字轉換為整數 tmp,如果 p 為 1,則將 tmp 減去 ans,否則將 tmp 加到 ans。最後,程式輸出 ans。
複雜度分析
- 時間複雜度: O(N*M),其中 N 是測試資料的數量,M 是每行字串的長度。最壞情況下,需要遍歷每行字串的所有字元。
- 空間複雜度: O(1),程式只使用了常數級別的額外空間。
程式碼
#include <iostream>
using namespace std;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
int n,ans;
bool p;
string a;
cin >> n;
getline(cin,a);
while(n--){
getline(cin,a);
a+=' ';
ans=0;
p=0;
for(int al(a.length()-1),i(0),tmp(0);i<al;++i,tmp=0){
if(a[i]=='-'){
++i;p=1;
}
while(a[i]!=' '){
tmp=(tmp<<3)+(tmp<<1)+a[i]-48;
++i;
}
(p)?ans-=tmp,p=0:ans+=tmp;
}
cout << ans << "\n";
}
}