Показать сообщение отдельно
Тема: Помогите решить задачу используя Excell | by Grisha_T34
Непрочитано 04.06.2010, 16:50   # 9
 
Аватар для egblob
 
Регистрация: 31.01.2007
Адрес: Новосибирск
Сообщений: 2,834
Записей в дневнике: 5
egblob вне форума
Вот такой код. Без особых хитростей. Любой компилятор должен собрать.
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();
}
Цитата