fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <sstream>
  5. #include <fstream>
  6. #include <time.h>
  7.  
  8. using namespace std;
  9.  
  10. struct Equation {
  11. int broj = 0;
  12. string izraz = "";
  13. };
  14.  
  15. Equation result[2][10000];
  16.  
  17. int resultPointer[2] = { 0,0 };
  18.  
  19.  
  20. void permutateOrder(Equation numbers[], int operations[], int arrayLength, bool
  21. obeysRules, int arrayIdentifier) {
  22.  
  23. for (int i = 0; i < arrayLength - 1; i++)
  24. {
  25.  
  26. int tempNumber1 = numbers[i].broj;
  27. int tempNumber2 = numbers[i + 1].broj;
  28.  
  29. string tempString1 = numbers[i].izraz;
  30. string tempString2 = numbers[i + 1].izraz;
  31.  
  32. if (operations[arrayLength - 2] == 0) {
  33. numbers[i].broj = tempNumber1 + tempNumber2;
  34. numbers[i].izraz = "(" + tempString1 + "+" + tempString2 + ")";
  35. }
  36. if (operations[arrayLength - 2] == 1) {
  37. numbers[i].broj = tempNumber1 - tempNumber2;
  38. numbers[i].izraz = "(" + tempString1 + "-" + tempString2 + ")";
  39. }
  40. if (operations[arrayLength - 2] == 2) {
  41. numbers[i].broj = tempNumber1 * tempNumber2;
  42. numbers[i].izraz = "(" + tempString1 + "*" + tempString2 + ")";
  43. }
  44. if (operations[arrayLength - 2] == 3) {
  45. if (tempNumber2 == 0 || tempNumber1 % tempNumber2 != 0) {
  46. numbers[i].broj = 0;
  47. obeysRules = false;
  48. }
  49. else {
  50. numbers[i].broj = tempNumber1 / tempNumber2;
  51. }
  52. numbers[i].izraz = "(" + tempString1 + "/" + tempString2 + ")";
  53. }
  54.  
  55. if (operations[arrayLength - 2] == 4) {
  56. for (int j = arrayLength - 2; j < 4; j++) {
  57. if (operations[j] != 4) {
  58. obeysRules = false;
  59. break;
  60. }
  61. }
  62. int temp = tempNumber2;
  63. int digit = 1;
  64. while (temp > 0) {
  65. temp = temp / 10;
  66. digit = digit * 10;
  67. }
  68. arrayIdentifier = 1;
  69. numbers[i].broj = tempNumber1 * digit + tempNumber2;
  70. numbers[i].izraz = "(" + tempString1 + "#" + tempString2 + ")";
  71. }
  72.  
  73. for (int j = i + 1; j < arrayLength - 1; j++) {
  74. numbers[j] = numbers[j + 1];
  75. }
  76.  
  77. permutateOrder(numbers, operations, arrayLength - 1, obeysRules, arrayIdentifier);
  78.  
  79. for (int j = arrayLength - 1; j > i + 1; j--) {
  80. numbers[j] = numbers[j - 1];
  81. }
  82.  
  83. numbers[i].broj = tempNumber1;
  84. numbers[i + 1].broj = tempNumber2;
  85. numbers[i].izraz = tempString1;
  86. numbers[i + 1].izraz = tempString2;
  87. }
  88.  
  89. if (arrayLength == 1)
  90. {
  91. bool isDuplicate = false;
  92. if (arrayIdentifier)numbers[0].izraz = to_string(numbers[0].broj) + " = " +numbers[0].izraz + " ***\n";
  93. else numbers[0].izraz = to_string(numbers[0].broj) + " = " + numbers[0].izraz + "\n";
  94.  
  95. Equation tempResult = numbers[0];
  96. if (tempResult.broj > -1 && obeysRules)
  97. {
  98. for (int i = 0; i < resultPointer[arrayIdentifier]; i++)
  99. {
  100. if (result[arrayIdentifier][i].broj == tempResult.broj)
  101. {
  102. isDuplicate = true;
  103. break;
  104. }
  105. }
  106. if (!isDuplicate) {
  107. result[arrayIdentifier][resultPointer[arrayIdentifier]] = tempResult;
  108. resultPointer[arrayIdentifier]++;
  109. }
  110. }
  111. }
  112. }
  113.  
  114. void permutateNumbers(Equation numbers[], int arrayPointer, int operationNumber)
  115. {
  116. if (arrayPointer == 4) {
  117.  
  118. int operations[] = { 0,0,0,0 };
  119.  
  120. while (operations[0] < operationNumber)
  121. {
  122. permutateOrder(numbers, operations, 5, true, 0);
  123.  
  124. operations[3]++;
  125. for (int i = 3; i > 0; i--) {
  126. if (operations[i] == operationNumber) {
  127. operations[i] = 0;
  128. operations[i - 1]++;
  129. }
  130. }
  131. }
  132.  
  133. }
  134.  
  135. else {
  136. for (int i = arrayPointer; i < 5; i++)
  137. {
  138. swap(numbers[arrayPointer], numbers[i]);
  139. permutateNumbers(numbers, arrayPointer + 1, operationNumber);
  140. swap(numbers[arrayPointer], numbers[i]);
  141. }
  142. }
  143. }
  144.  
  145. int main() {
  146. cout<<"Program za ispis demonstracije:\n";
  147. cout<<"Koliko se brojeva, od 1 do nekog prirodnog broja, uzastopno, moze zapisati ispravnim izrazom sa samo pet prirodnih brojeva, sa zagradama i sa cetiri osnovne racunske operacije. \n";
  148. cout<<"Brojevi koje nije moguce dobiti gornjim uvjetima, dobiveni su ljepljenjem znamenki. Pokraj takvog zapisa je oznaka ***.\n";
  149. cout<<"Unesi pet brojeva odovojenih razmakom.\n";
  150. Equation numbers[5];
  151. int number;
  152. clock_t t;
  153. for (int i = 0; i < 5; i++) {
  154. cin >> number;
  155. numbers[i].broj = number;
  156. numbers[i].izraz = to_string(number);
  157. }
  158. t = clock();
  159. permutateNumbers(numbers, 0, 5);
  160. bool isEqual = false;
  161. for (int i = 0; i < resultPointer[1]; i++) {
  162. for (int j = 0; j < resultPointer[0]; j++) {
  163. if (result[1][i].broj == result[0][j].broj) {
  164. isEqual = true;
  165. break;
  166. }
  167. }
  168. if (!isEqual) {
  169. result[0][resultPointer[0]] = result[1][i];
  170. resultPointer[0]++;
  171. }
  172. isEqual = false;
  173. }
  174.  
  175. Equation temp;
  176. for (int i = 0; i < resultPointer[0] - 1; i++) {
  177. for (int j = i + 1; j < resultPointer[0]; j++) {
  178. if (result[0][i].broj > result[0][j].broj) {
  179. temp = result[0][i];
  180. result[0][i] = result[0][j];
  181. result[0][j] = temp;
  182. }
  183. }
  184. }
  185.  
  186. for (int i = 0; i < resultPointer[0] - 1; i++) {
  187. if (result[0][i + 1].broj - result[0][i].broj != 1) {
  188. resultPointer[0] = i + 2;
  189. break;
  190. }
  191. }
  192.  
  193. ofstream file;
  194. file.open("rjesenje.txt");
  195. for (int i = 0; i < resultPointer[0]; i++) {
  196. cout << result[0][i].izraz;
  197. file << result[0][i].izraz;
  198. }
  199. t = clock() - t;
  200. float time = ((float)t) / CLOCKS_PER_SEC;
  201. cout << time<<"s";
  202. }
  203.  
  204.  
Success #stdin #stdout 1.44s 5288KB
stdin
45
stdout
Program za ispis demonstracije:
Koliko se brojeva, od 1 do nekog prirodnog broja, uzastopno, moze zapisati ispravnim izrazom sa samo pet prirodnih brojeva, sa zagradama i sa cetiri osnovne racunske operacije. 
Brojevi koje nije moguce dobiti gornjim uvjetima, dobiveni su ljepljenjem znamenki. Pokraj takvog zapisa je oznaka ***.
Unesi pet brojeva odovojenih razmakom.
0 = ((((45-45)*45)-45)+45)
1 = ((45/45)+((45-45)*45))
2 = ((((45+45)/45)-45)+45)
3 = (((45+45)/45)+(45/45))
4 = ((((45+45)+45)+45)/45)
11 = (((45#45)/45)-(45+45)) ***
1.429s