BorrowTheProgrammer

lab4_MKV

Dec 5th, 2021
611
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*Программа разбиения целых чисел с использованием алгоритма Гинденбурга*/
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. void printResult(int*, int);
  6. int hindenburgAlgo(int*, int, int);
  7. int getSum(int*, int);
  8. bool greaterThenM(int*, int);
  9.  
  10. int main()
  11. {
  12.     int n, m = 0;
  13.     cout << "Введите число n: ";
  14.     cin >> n;
  15.     if (n <= 0) {
  16.         cout << "Введено неправильное число n" << endl;
  17.         return -1;
  18.     }
  19.     cout << "Введите число m: ";
  20.     cin >> m;
  21.     if (m <= 0) {
  22.         cout << "Введено неправильное число m" << endl;
  23.         return -2;
  24.     }
  25.    
  26.     // инициализировать массив со слагаемыми
  27.     int set[m] = {0};
  28.     set[m-1] = n;
  29.     int *ptr = set;
  30.    
  31.     while( hindenburgAlgo(ptr, n, m) > 0) {
  32.         if (greaterThenM(ptr, m)) {
  33.             printResult(ptr, m);  
  34.         }
  35.         // printResult(ptr, m);
  36.     }
  37.    
  38.     return 0;
  39. }
  40.  
  41. int hindenburgAlgo(int *array, int n, int m) {
  42.     int *last = &array[m-1];
  43.     if ((*last - *array) <= 2) {
  44.         return -1;
  45.     }
  46.     for (int *ptr=&array[m-2]; ptr>=array; ptr--) {
  47.         int *num = ptr;
  48.         if ((*last - *num) >= 2) {
  49.             for (int *ptr2 = num; ptr2<&array[m-1]; ptr2++) {
  50.                 *ptr2 = *num + 1;
  51.             }
  52.             *last = n - getSum(array, m);
  53.             break;
  54.         }
  55.     }
  56.     return 2;
  57. }
  58.  
  59. void printResult(int *arr, int m) {
  60.     int i;
  61.     for (int *ptr=arr; ptr<&arr[m]; ptr++) {
  62.         if (*ptr == 0)
  63.             continue;
  64.         if (ptr == &arr[m-1]) {
  65.             cout << *ptr << endl;
  66.         } else {
  67.            cout << *ptr << " + ";
  68.         }
  69.     }
  70.     cout << endl;
  71. }
  72.  
  73. int getSum(int *arr, int m) {
  74.     int sum = 0;
  75.     for (int *ptr=arr; ptr<&arr[m-1]; ptr++) {
  76.         sum += *ptr;
  77.     }
  78.     return sum;
  79. }
  80.  
  81. bool greaterThenM(int *arr, int m) {
  82.     bool a = false;
  83.     int *last = &arr[m-1];
  84.     int *prelast = &arr[m-2];
  85.    
  86.     // if (*prelast > *last) {
  87.     //     return false;
  88.     // }
  89.    
  90.     for (int *ptr=arr; ptr<&arr[m]; ptr++) {
  91.         if (*ptr >= m) {
  92.             a = true;
  93.         }
  94.     }
  95.    
  96.     return a;
  97. }
RAW Paste Data