# String Manipulation# Validation# Conditional Statements

e925 - pD. 學號檢查

🔗 前往 ZeroJudge 原題

題目描述

題目要求驗證 10 個大學學號的有效性。學號的格式為九位字元,第一位必須是 'B',第二、三位是數字,第四到七位是院系組代號,第八、九位是數字。程式需要檢查學號是否符合這些格式要求,並檢查第四到七位是否在給定的院系組代號列表中。最後,計算並輸出驗證失敗的比例。

解題思路

程式首先讀取院系組代號列表,並儲存在字串陣列中。然後,程式迴圈讀取 10 個學號,並對每個學號進行驗證。驗證包括檢查第一位是否為 'B',第二和第三位是否為數字,第八和第九位是否為數字,以及第四到七位是否在院系組代號列表中。如果學號不符合任何一個驗證條件,則輸出 'N' 並增加錯誤計數器。如果所有驗證都通過,則輸出 'Y'。最後,程式計算並輸出錯誤比例。

複雜度分析

  • 時間複雜度: O(N + 10 * M),其中 N 是院系組代號的數量,M 是學號的長度。讀取院系組代號列表需要 O(N) 時間。驗證每個學號需要 O(M) 時間,由於有 10 個學號,因此驗證所有學號需要 O(10 * M) 時間。
  • 空間複雜度: O(N + M),其中 N 是院系組代號的數量,M 是學號的長度。程式需要儲存院系組代號列表,需要 O(N) 空間。儲存學號需要 O(M) 空間。

程式碼

#include <iostream>
using namespace std;
int main(){
	int n,t,wa=0,ac=10;
	string tt;
	cin >> n;
	string a[n];
	for(int i=0;i<n;++i)
		cin >> a[i];
	while(ac--){
		cin >> tt;
		if(tt[0]!='B'||tt[1]>'9'||tt[1]<'0'||tt[2]>'9'||tt[2]<'0'||tt[7]>'9'||tt[7]<'0'||tt[8]>'9'||tt[8]<'0'){
			cout << "N\n";
			++wa;
		}
		else{
			string k;
			for(int i=3;i<=6;++i)
				k+=tt[i];
			bool chat=0;
			for(int i=0;i<n;++i){
				if(a[i]==k){
					chat=1;
					break;
				}
			}
			if(chat==0){
				cout << "N\n";
				++wa;
			}
			else
				cout << "Y\n";
		}
	}
	if(wa==0)
		cout << "0";
	else
		cout << "0." << wa << "\n";
}

Discussion