# String# Math# Greedy

d103 - NOIP 2008 1.ISBN号码

🔗 前往 ZeroJudge 原題

題目描述

題目要求驗證 ISBN 編號的有效性,並在無效時提供正確的 ISBN 編號。ISBN 編號由 9 位數字和 1 位檢查碼組成,檢查碼的計算方式是將前 9 位數字按權重(1 到 9)加權求和,然後對 11 取模。如果餘數為 10,則檢查碼為 'X';否則,檢查碼為餘數的字元表示。

解題思路

程式碼首先讀取 ISBN 編號字串。然後,它提取前 9 位數字,計算加權和,並計算檢查碼。最後,它將計算出的檢查碼與輸入的檢查碼進行比較。如果它們匹配,則輸出 "Right"。否則,它會將輸入字串的最後一個字元替換為正確的檢查碼,並輸出修改後的 ISBN 編號。

複雜度分析

  • 時間複雜度: O(n),其中 n 是 ISBN 編號的長度。主要時間花在遍歷字串和計算加權和上。
  • 空間複雜度: O(1),因為程式碼只使用固定數量的額外空間。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a;
	while(cin >> a){
		string b;
		int sum=0;
		for(int i=0;i<a.length()-1;i++)
			if(a[i]>='0'&&a[i]<='9')
				b+=a[i];
		for(int i=0;i<9;i++){
			sum+=(b[i]-48)*(i+1);
		}		
		sum%=11;
		if(sum==10){
			if(a[a.length()-1]=='X')
				cout << "Right\n";
			else{
				a[a.length()-1]='X';
				cout << a << "\n";
			}	
		}
		else{
			if(a[a.length()-1]-48==sum)
				cout << "Right\n";
			else{
				a[a.length()-1]=sum+48;
				cout << a << "\n";
			}	
		}
	}
}

Discussion