b536 - 國際標準書號 ISBN
題目描述
題目要求判斷輸入的國際標準書號 (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";
}
}
}