Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <cmath>
- #define ROWS 4
- using namespace std;
- int main(int argc, const char * argv[]) {
- char isbn[14], *isbn_ptr; //0-7167-03r4-0
- int *isbn_numbers = new int[10];
- cout << "Please enter an ISBN code: ";
- cin >> isbn;
- isbn_ptr = isbn;
- int i = 0, k = 10;
- int ind = -1;
- while (*isbn_ptr != '\0') {
- if (*isbn_ptr >= 48 && *isbn_ptr <= 57) {
- isbn_numbers[i++] = (int)(*isbn_ptr) - 48;
- }
- else {
- if (*isbn_ptr != '-') {
- //cout << *isbn_ptr << endl;
- ind = k;
- isbn_numbers[i++] = -1;
- }
- }
- isbn_ptr++;
- if (*isbn_ptr != '-') k--;
- }
- if (ind != -1) {
- cout << "There is missing number in the ISBN code and we will find it :)\n";
- int sum = 0;
- for (int i = 0; i < 10; i++) {
- if (isbn_numbers[i] != -1) {
- sum += (10 - i)*isbn_numbers[i];
- }
- }
- //cout << "\nsum = " << sum << endl;
- cout << "missing possition " << ind << endl;
- //имаме следното уравнение ind*x+sum =0 (mod 11)
- //Трябва да намерим НОД на (ind, 11) = nod
- //След което по Безу ще имаме ind*s+11*t = nod
- int nod = 0, s = 0, t = 0;
- //прилагаме тъждество на Безу
- int a, b;
- a = ind;
- b = 11;
- int cnt = 0;
- //преброяваме всички остатъци от деленето на a и b,
- //за да конструираме динамичен двумерен масив
- if (a < b) {
- a ^= b;
- b ^= a;
- a ^= b;
- }
- int x = a;
- int y = b;
- int tmp = x % y;
- while (tmp) {
- x = (tmp > y) ? tmp : y;
- y = (tmp < y) ? tmp : y;
- tmp = x % y;
- cnt++;
- }
- //cout << "cnt = " << cnt << endl;
- if (cnt > 0) {
- //създаваме двумерен динамичен масив, в който ще съхраним стойностите
- int ** arr = new int*[ROWS];
- for (unsigned int i = 0; i < ROWS; i++) {
- arr[i] = new int[cnt + 2];
- }
- x = a;
- y = b;
- arr[0][0] = x;
- arr[0][1] = y;
- arr[1][0] = 0;
- arr[2][0] = 1;
- arr[2][1] = 0;
- arr[3][0] = 0;
- arr[3][1] = 1;
- int j = 2;
- tmp = x % y;
- while (tmp) {
- arr[0][j] = tmp;
- arr[1][j - 1] = x / y;
- x = (tmp > y) ? tmp : y;
- y = (tmp < y) ? tmp : y;
- tmp = x % y;
- j++;
- }
- arr[1][j - 1] = x / y;
- for (unsigned int i = 2; i < ROWS; i++) {
- for (unsigned int j = 2; j < cnt + 2; j++) {
- if (i == 2)
- arr[i][j] = arr[i - 1][j - 1] * arr[i][j - 1] + arr[i][j - 2];
- else
- arr[i][j] = arr[i - 2][j - 1] * arr[i][j - 1] + arr[i][j - 2];
- }
- }
- for (unsigned int j = 0; j < cnt + 2; j++) {
- nod = arr[0][j];
- s = pow(-1, j) * arr[2][j];
- t = pow(-1, j + 1) * arr[3][j];
- }
- //освобождаваме заетата от масива памет
- for (unsigned int i = 0; i < ROWS; i++) {
- delete[] arr[i];
- }
- delete[] arr;
- }
- //край на тъждество на Безу
- //cout << "nod = " << nod << "\ns = " << s << "\nt = " << t << endl;
- //ind - липсващата позиция
- //sum - натрупаната сума от известните числа в кода
- //остава да се рещи уравнението ind*x+sum = 0 (mod 11)
- //което след Безу може да се сведе до x+s*sum = 0 (mod 11) или x+t*sum = 0 (mod 11)
- //в зависимост дали max(ind, 11) = ind, тогава ще решаваме x+s*sum = 0 (mod 11)
- //ако max(ind, 11) = 11, тогава ще решаваме x+t*sum = 0 (mod 11)
- int tmp_s = (ind > 11) ? s : t;
- i = 0;
- while ((i + tmp_s * sum) % 11 != 0) i++;
- cout << "The missing number is " << i << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement