Вот такой код. Без особых хитростей. Любой компилятор должен собрать.
Gear gears[] = {{23, 1}, {24, 1},...} - это, как можно догадаться, число зубов и количество таких колес. Если захочешь добавить еще элементов, следи, чтобы числа зубов шли по возрастанию, это важно.
Различия с твоим примером в 7 знаке после запятой вылезли из-за ошибок округления похоже, быстро победить не получилось че-то.
Особо не тестил, но вроде как работает.
Код:
#include <conio.h>
#include <math.h>
#include <iostream>
struct Gear
{
int teeth;
int amount;
};
int main(int argc, char *argv[])
{
Gear gears[] =
{{23, 1}, {24, 1}, {25, 2}, {30, 1}, {35, 1}, {36, 1}, {37, 1}, {40, 1}, {41, 1}, {43, 1},
{45, 1}, {47, 1}, {48, 1}, {50, 1}, {53, 1}, {54, 2}, {55, 1}, {58, 1}, {59, 1}, {60, 1},
{61, 1}, {62, 1}, {65, 1}, {66, 1}, {67, 1}, {70, 1}, {71, 1}, {72, 1}, {73, 1}, {74, 1},
{75, 1}, {78, 1}, {79, 1}, {80, 1}, {81, 1}, {83, 1}, {84, 1}, {85, 1}, {86, 1}, {89, 1},
{90, 1}, {92, 1}, {94, 1}, {97, 1}, {99, 1}, {100, 1}};
double dif = 100.0;
double val;
int res[4];
std::cout << "Enter value ";
std::cin >> val;
for (int a = 0; a < sizeof(gears)/sizeof(Gear); a++)
{
gears[a].amount--;
for (int b = a + 1; b < sizeof(gears)/sizeof(Gear); b++)
{
if(!gears[b].amount)
continue;
gears[b].amount--;
for (int c = 0; c < sizeof(gears)/sizeof(Gear); c++)
{
if(!gears[c].amount)
continue;
gears[c].amount--;
for (int d = c + 1; d < sizeof(gears)/sizeof(Gear); d++)
{
if(!gears[d].amount)
continue;
double buf = fabs((double)gears[a].teeth / gears[b].teeth * gears[c].teeth / gears[d].teeth - val);
if(dif > buf)
{
dif = buf;
res[0] = gears[a].teeth;
res[1] = gears[b].teeth;
res[2] = gears[c].teeth;
res[3] = gears[d].teeth;
}
}
gears[c].amount++;
}
gears[b].amount++;
}
gears[a].amount++;
}
std::cout << "a = " << res[0] << "; b = " << res[1] << "; c = " << res[2] << "; d = " << res[3] << "; Ratio = " << (double)res[0]/res[1]*res[2]/res[3] << ".";
getch();
}