Kiểm tra một dãy số có phải là mã ISBN-10 hợp lệ hay không.
ISBN-10: 10 chữ số. 9 chữ số đầu đại diện cho tiêu đề, nhà xuất bản, nhóm. Chữ số cuối (check digit) có thể là 0-9 hoặc 'X' (giá trị 10).
Cách kiểm tra:
- Nhân chữ số thứ i (từ 1 đến 9) với (10 - i + 1) = (11 - i).
- Chữ số thứ 10: nếu 'X' thì giá trị 10, else giá trị chữ số.
- Tổng các tích. Nếu tổng chia hết cho 11 -> ISBN hợp lệ.
Ví dụ
Input: 002442142X -> Output: Khong phai ISBN Input: 007462542X -> Output: La ISBN
Thuật toán
Bắt đầu
Bước 1: Hàm isvalid(string &isbn)
Nếu độ dài != 10 -> false
sum = 0
Với i=0 đến 8:
value = isbn[i] - '0'
Nếu value không trong [0,9] -> false
sum += value * (10 - i)
last = isbn[9]
Nếu last không phải 'X' và không phải chữ số -> false
sum += (last == 'X') ? 10 : (last - '0')
Trả về (sum % 11 == 0)
Bước 2: main()
isbn = "002442142X"
Nếu isvalid -> in "La hop le"
Ngược lại -> in "Khong hop le"
Kết thúc
Ví dụ code
#include <bits/stdc++.h>
using namespace std;
bool isvalid(string &isbn_number) {
int n = isbn_number.length();
if (n != 10) return false;
int sum = 0;
for (int i = 0; i < 9; i++) {
int value = isbn_number[i] - '0';
if (value < 0 || value > 9) return false;
sum += value * (10 - i);
}
char last_val = isbn_number[9];
if (last_val != 'X' && (last_val < '0' || last_val > '9')) return false;
sum += (last_val == 'X') ? 10 : (last_val - '0');
return (sum % 11 == 0);
}
int main() {
string isbn_number = "002442142X";
if (isvalid(isbn_number))
cout << isbn_number << " la hop le";
else
cout << isbn_number << " khong hop le";
return 0;
}
Kết quả
002442142X khong hop le