# String Manipulation# Mathematical Calculation# Conditional Logic

b536 - 國際標準書號 ISBN

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷輸入的國際標準書號 (ISBN) 是否有效。ISBN 有 10 位和 13 位兩種格式,題目給定了計算檢查碼的方法,並要求根據輸入的 ISBN 號碼,驗證其檢查碼是否正確,正確則輸出 "T",錯誤則輸出 "F"。

解題思路

程式首先讀取測試資料的數量 n,然後迴圈處理每一筆測試資料。對於每一筆資料,程式首先判斷 ISBN 的長度,如果是 10 位,則使用 ISBN-10 的驗證方法;如果是其他長度,則使用 ISBN-13 的驗證方法。 ISBN-10 的驗證方法是計算加權和,然後計算餘數,最後計算差值,並將差值與 ISBN 的最後一位進行比較。 ISBN-13 的驗證方法類似,但加權方式不同。程式會忽略 ISBN 中的連字號,並根據格式計算檢查碼,最後與實際的檢查碼比較,輸出結果。

複雜度分析

  • 時間複雜度: O(n*m),其中 n 是測試資料的數量,m 是 ISBN 字串的長度。因為對於每一筆測試資料,都需要遍歷 ISBN 字串一次來計算加權和。
  • 空間複雜度: O(1),程式只使用了常數級別的額外空間。

程式碼

#include <iostream>
using namespace std;
int main(){
	int n;
	string a;
	cin >> n;
	getline(cin,a);
	while(n--){
		getline(cin,a);
		int al=a.length(),il=0,it=0,sum=0;
		for(int i=0;i<al;++i)
			if(a[i]!='-')++il;
		if(il==10){
			while(il>1){
				if(a[it]!='-'){
					sum+=(a[it]-'0')*il;
					--il;
				}
				++it;
			}
			sum%=11;
			sum=11-sum;
			char ans;
			if(sum==10)
				ans='X';
			else
				ans='0'+sum;
			if(a[al-1]==ans)
				cout << "T\n";
			else
				cout << "F\n"; 
		}
		else{
			il=0;
			while(il<12){
				if(a[it]!='-'){
					if(il%2)
						sum+=(a[it]-'0')*3;
					else
						sum+=(a[it]-'0')*1;
					++il;
				}
				++it;
			}
			sum%=10;
			sum=10-sum;
			if(sum==10)sum=0;
			if(a[al-1]==sum+48)
				cout << "T\n";
			else
				cout << "F\n"; 
		}
	}
}

Discussion