#include <iostream>
using namespace std;
void setBasicNumberDivisors(int v_basic_number, int *basic_number_divisors);
void loadNumber(int v_how_many, int *number);
void checkNumber(int *number, int *basic_number_divisors, int *check_number);
void setLargestCommonDivisors(int *number, int *largest_common_divisors, int *basic_number_divisors, int *check_number, int *which_number);
void sortDivisors(int *largest_common_divisors, int how_many, int *number);
void showCommonDivisors(int *largest_common_divisors, int how_many);
void showNumbers(int *number, int how_many);
int main()
{
int basic_number{1260};
int basic_number_divisors[36]; // an array storing all off basic_number divisors
int *check_number = new int{0};
int *which_number = new int{0};
int how_many{0};
cin >> how_many;
int *number = new int[how_many];
int *largest_common_divisors = new int[how_many];
// determine divisors of 1260 and set them all to variable "all_basic_number_divisors"
setBasicNumberDivisors(basic_number, basic_number_divisors);
//load numbers
loadNumber(how_many, number);
for (int i = 0; i < how_many; i++)
{
// checks the number of common divisors between the "number" and the "basic_number"
checkNumber(number, basic_number_divisors, check_number);
// determine common divisors and set them all to variable "largest_common_divisors"
setLargestCommonDivisors(number, largest_common_divisors, basic_number_divisors, check_number, which_number);
number++;
}
//sort common divisors
sortDivisors(largest_common_divisors, how_many, number);
//show result
showCommonDivisors(largest_common_divisors, how_many);
showNumbers(number, how_many);
return 0;
}
// determine all divisors of 1260 and set them all to variable "all_basic_number_divisors"
void setBasicNumberDivisors(int v_basic_number, int *basic_number_divisors)
{
for (int i = 1; i <= v_basic_number; i++)
{
if (v_basic_number % i == 0)
{
*basic_number_divisors = i;
basic_number_divisors++;
}
}
}
void loadNumber(int v_how_many, int *number)
{
for (int i = 0; i < v_how_many; i++)
{
cin >> *number;
number++;
}
}
// checks the number of common divisors between the "number" and the "basic_number"
void checkNumber(int *number, int *basic_number_divisors, int *check_number)
{
for (int i = 0; i < 36; i++)
{
if (*number >= *basic_number_divisors)
{
*check_number = *check_number + 1;
}
else
{
break;
}
basic_number_divisors++;
}
}
// determine common divisors and set them all to variable "largest_common_divisors"
void setLargestCommonDivisors(int *number, int *largest_common_divisors, int *basic_number_divisors, int *check_number, int *which_number)
{
largest_common_divisors += *which_number;
for (int i = 0; i < *check_number; i++) // is executed as many times as "number" has common divisors with the "basic_number"
{
if (*number % *basic_number_divisors == 0)
{
*largest_common_divisors = *basic_number_divisors;
}
basic_number_divisors++;
}
basic_number_divisors -= *check_number;
*check_number = 0;
*which_number = *which_number + 1;
}
void sortDivisors(int *largest_common_divisors, int how_many, int *number)
{
number = number - how_many;
int temp = 0;
int temp_number = 0;
for (int i = 0; i < (how_many); i++)
{
for (int j = 0; j < (how_many - 1); j++)
{
largest_common_divisors = largest_common_divisors + j;
number = number + j;
if (*largest_common_divisors < *(largest_common_divisors + 1))
{
// algorithm for sorting tables with the largest common divisors
temp = *largest_common_divisors;
*largest_common_divisors = *(largest_common_divisors + 1);
*(largest_common_divisors + 1) = temp;
// algorithm for sorting tables with numbers
temp_number = *number;
*number = *(number + 1);
*(number + 1) = temp_number;
}
// ----- THE CODE BELOW DOES NOT WORK -----
// if the divisors have the same value next to each other, the algoritm sorts the corresponding numbers in ascending order
else if (*largest_common_divisors == *(largest_common_divisors + 1 ))
{
if (*number > (*number + 1))
{
temp_number = *number;
*number = *(number + 1);
*(number + 1) = temp_number;
}
}
// ----- THE CODE ABOVE DOES NOT WORK -----
largest_common_divisors = largest_common_divisors - j;
number = number - j;
}
}
}
void showCommonDivisors(int *largest_common_divisors, int how_many)
{
cout << endl
<< "Common Divisors:" << endl;
for (int i = 0; i < how_many; i++)
{
cout << *largest_common_divisors << " ";
largest_common_divisors++;
}
cout << endl;
}
void showNumbers(int *number, int how_many)
{
cout << endl
<< "Numbers:" << endl;
number = number - how_many;
for (int i = 0; i < how_many; i++)
{
cout << *number << " ";
number++;
}
cout << endl;
}