#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <time.h>
using namespace std;
struct Equation {
int broj = 0;
string izraz = "";
};
Equation result[2][10000];
int resultPointer[2] = { 0,0 };
void permutateOrder(Equation numbers[], int operations[], int arrayLength, bool
obeysRules, int arrayIdentifier) {
for (int i = 0; i < arrayLength - 1; i++)
{
int tempNumber1 = numbers[i].broj;
int tempNumber2 = numbers[i + 1].broj;
string tempString1 = numbers[i].izraz;
string tempString2 = numbers[i + 1].izraz;
if (operations[arrayLength - 2] == 0) {
numbers[i].broj = tempNumber1 + tempNumber2;
numbers[i].izraz = "(" + tempString1 + "+" + tempString2 + ")";
}
if (operations[arrayLength - 2] == 1) {
numbers[i].broj = tempNumber1 - tempNumber2;
numbers[i].izraz = "(" + tempString1 + "-" + tempString2 + ")";
}
if (operations[arrayLength - 2] == 2) {
numbers[i].broj = tempNumber1 * tempNumber2;
numbers[i].izraz = "(" + tempString1 + "*" + tempString2 + ")";
}
if (operations[arrayLength - 2] == 3) {
if (tempNumber2 == 0 || tempNumber1 % tempNumber2 != 0) {
numbers[i].broj = 0;
obeysRules = false;
}
else {
numbers[i].broj = tempNumber1 / tempNumber2;
}
numbers[i].izraz = "(" + tempString1 + "/" + tempString2 + ")";
}
if (operations[arrayLength - 2] == 4) {
for (int j = arrayLength - 2; j < 4; j++) {
if (operations[j] != 4) {
obeysRules = false;
break;
}
}
int temp = tempNumber2;
int digit = 1;
while (temp > 0) {
temp = temp / 10;
digit = digit * 10;
}
arrayIdentifier = 1;
numbers[i].broj = tempNumber1 * digit + tempNumber2;
numbers[i].izraz = "(" + tempString1 + "#" + tempString2 + ")";
}
for (int j = i + 1; j < arrayLength - 1; j++) {
numbers[j] = numbers[j + 1];
}
permutateOrder(numbers, operations, arrayLength - 1, obeysRules, arrayIdentifier);
for (int j = arrayLength - 1; j > i + 1; j--) {
numbers[j] = numbers[j - 1];
}
numbers[i].broj = tempNumber1;
numbers[i + 1].broj = tempNumber2;
numbers[i].izraz = tempString1;
numbers[i + 1].izraz = tempString2;
}
if (arrayLength == 1)
{
bool isDuplicate = false;
if (arrayIdentifier)numbers[0].izraz = to_string(numbers[0].broj) + " = " +numbers[0].izraz + " ***\n";
else numbers[0].izraz = to_string(numbers[0].broj) + " = " + numbers[0].izraz + "\n";
Equation tempResult = numbers[0];
if (tempResult.broj > -1 && obeysRules)
{
for (int i = 0; i < resultPointer[arrayIdentifier]; i++)
{
if (result[arrayIdentifier][i].broj == tempResult.broj)
{
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
result[arrayIdentifier][resultPointer[arrayIdentifier]] = tempResult;
resultPointer[arrayIdentifier]++;
}
}
}
}
void permutateNumbers(Equation numbers[], int arrayPointer, int operationNumber)
{
if (arrayPointer == 4) {
int operations[] = { 0,0,0,0 };
while (operations[0] < operationNumber)
{
permutateOrder(numbers, operations, 5, true, 0);
operations[3]++;
for (int i = 3; i > 0; i--) {
if (operations[i] == operationNumber) {
operations[i] = 0;
operations[i - 1]++;
}
}
}
}
else {
for (int i = arrayPointer; i < 5; i++)
{
swap(numbers[arrayPointer], numbers[i]);
permutateNumbers(numbers, arrayPointer + 1, operationNumber);
swap(numbers[arrayPointer], numbers[i]);
}
}
}
int main() {
cout<<"Program za ispis demonstracije:\n";
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";
cout<<"Brojevi koje nije moguce dobiti gornjim uvjetima, dobiveni su ljepljenjem znamenki. Pokraj takvog zapisa je oznaka ***.\n";
cout<<"Unesi pet brojeva odovojenih razmakom.\n";
Equation numbers[5];
int number;
clock_t t;
for (int i = 0; i < 5; i++) {
cin >> number;
numbers[i].broj = number;
numbers[i].izraz = to_string(number);
}
t = clock();
permutateNumbers(numbers, 0, 5);
bool isEqual = false;
for (int i = 0; i < resultPointer[1]; i++) {
for (int j = 0; j < resultPointer[0]; j++) {
if (result[1][i].broj == result[0][j].broj) {
isEqual = true;
break;
}
}
if (!isEqual) {
result[0][resultPointer[0]] = result[1][i];
resultPointer[0]++;
}
isEqual = false;
}
Equation temp;
for (int i = 0; i < resultPointer[0] - 1; i++) {
for (int j = i + 1; j < resultPointer[0]; j++) {
if (result[0][i].broj > result[0][j].broj) {
temp = result[0][i];
result[0][i] = result[0][j];
result[0][j] = temp;
}
}
}
for (int i = 0; i < resultPointer[0] - 1; i++) {
if (result[0][i + 1].broj - result[0][i].broj != 1) {
resultPointer[0] = i + 2;
break;
}
}
ofstream file;
file.open("rjesenje.txt");
for (int i = 0; i < resultPointer[0]; i++) {
cout << result[0][i].izraz;
file << result[0][i].izraz;
}
t = clock() - t;
float time = ((float)t) / CLOCKS_PER_SEC;
cout << time<<"s";
}