fork(2) download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void setBasicNumberDivisors(int v_basic_number, int *basic_number_divisors);
  6. void loadNumber(int v_how_many, int *number);
  7. void checkNumber(int *number, int *basic_number_divisors, int *check_number);
  8. void setLargestCommonDivisors(int *number, int *largest_common_divisors, int *basic_number_divisors, int *check_number, int *which_number);
  9. void sortDivisors(int *largest_common_divisors, int how_many, int *number);
  10. void showNumbers(int *number, int how_many);
  11.  
  12. int main()
  13. {
  14. int basic_number{1260};
  15. int basic_number_divisors[36]; // an array storing all off basic_number divisors
  16.  
  17. int *check_number = new int{0};
  18. int *which_number = new int{0};
  19.  
  20. int how_many{0};
  21. cin >> how_many;
  22.  
  23. int *number = new int[how_many];
  24. int *largest_common_divisors = new int[how_many];
  25.  
  26. // determine divisors of 1260 and set them all to variable "all_basic_number_divisors"
  27. setBasicNumberDivisors(basic_number, basic_number_divisors);
  28.  
  29. //load numbers
  30. loadNumber(how_many, number);
  31.  
  32. for (int i = 0; i < how_many; i++)
  33. {
  34. // checks the number of common divisors between the "number" and the "basic_number"
  35. checkNumber(number, basic_number_divisors, check_number);
  36.  
  37. // determine common divisors and set them all to variable "largest_common_divisors"
  38. setLargestCommonDivisors(number, largest_common_divisors, basic_number_divisors, check_number, which_number);
  39.  
  40. number++;
  41. }
  42.  
  43. //sort common divisors
  44. sortDivisors(largest_common_divisors, how_many, number);
  45.  
  46. //show result
  47. showNumbers(number, how_many);
  48.  
  49. return 0;
  50. }
  51.  
  52. // determine all divisors of 1260 and set them all to variable "all_basic_number_divisors"
  53. void setBasicNumberDivisors(int v_basic_number, int *basic_number_divisors)
  54. {
  55. for (int i = 1; i <= v_basic_number; i++)
  56. {
  57. if (v_basic_number % i == 0)
  58. {
  59. *basic_number_divisors = i;
  60. basic_number_divisors++;
  61. }
  62. }
  63. }
  64.  
  65. void loadNumber(int v_how_many, int *number)
  66. {
  67. for (int i = 0; i < v_how_many; i++)
  68. {
  69. cin >> *number;
  70. number++;
  71. }
  72. }
  73.  
  74. // checks the number of common divisors between the "number" and the "basic_number"
  75. void checkNumber(int *number, int *basic_number_divisors, int *check_number)
  76. {
  77. for (int i = 0; i < 36; i++)
  78. {
  79. if (*number >= *basic_number_divisors)
  80. {
  81. *check_number = *check_number + 1;
  82. }
  83. else
  84. {
  85. break;
  86. }
  87. basic_number_divisors++;
  88. }
  89. }
  90.  
  91. // determine common divisors and set them all to variable "largest_common_divisors"
  92. void setLargestCommonDivisors(int *number, int *largest_common_divisors, int *basic_number_divisors, int *check_number, int *which_number)
  93. {
  94. largest_common_divisors += *which_number;
  95. for (int i = 0; i < *check_number; i++) // is executed as many times as "number" has common divisors with the "basic_number"
  96. {
  97. if (*number % *basic_number_divisors == 0)
  98. {
  99. *largest_common_divisors = *basic_number_divisors;
  100. }
  101. basic_number_divisors++;
  102. }
  103.  
  104. basic_number_divisors -= *check_number;
  105. *check_number = 0;
  106. *which_number = *which_number + 1;
  107. }
  108.  
  109. void sortDivisors(int *largest_common_divisors, int how_many, int *number)
  110. {
  111. number = number - how_many;
  112. int temp = 0;
  113. int temp_number = 0;
  114. for (int i = 0; i < (how_many); i++)
  115. {
  116. for (int j = 0; j < (how_many - 1); j++)
  117. {
  118. largest_common_divisors = largest_common_divisors + j;
  119. number = number + j;
  120.  
  121. if (*largest_common_divisors < *(largest_common_divisors + 1))
  122. {
  123. // algorithm for sorting tables with the largest common divisors
  124. temp = *largest_common_divisors;
  125. *largest_common_divisors = *(largest_common_divisors + 1);
  126. *(largest_common_divisors + 1) = temp;
  127.  
  128. // algorithm for sorting tables with numbers
  129. temp_number = *number;
  130. *number = *(number + 1);
  131. *(number + 1) = temp_number;
  132. }
  133.  
  134. // if the divisors have the same value next to each other, the algoritm sorts the corresponding numbers in ascending order
  135. else if (*largest_common_divisors == *(largest_common_divisors + 1))
  136. {
  137. if (*number > *(number + 1))
  138. {
  139. temp_number = *number;
  140. *number = *(number + 1);
  141. *(number + 1) = temp_number;
  142. }
  143. }
  144.  
  145. largest_common_divisors = largest_common_divisors - j;
  146. number = number - j;
  147. }
  148. }
  149. }
  150.  
  151. void showNumbers(int *number, int how_many)
  152. {
  153. number = number - how_many;
  154. for (int i = 0; i < how_many; i++)
  155. {
  156. cout << *number << " ";
  157. number++;
  158. }
  159. }
Success #stdin #stdout 0s 4400KB
stdin
10
2 60 101 99 305 85 25 65 5 55
stdout
60 99 5 25 55 65 85 305 2 101