# String Parsing# Greedy# Basic Math

b581 - 一串加

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取多組測試資料,每組資料包含一行由空格分隔的整數,包含正數和負數(負數前面會有一個減號)。程式需要計算每一行整數的和,並輸出結果。

解題思路

程式首先讀取測試資料的數量 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";
	}
}

Discussion