Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2012, 21:46   #11
nba-world
 
Регистрация: 10.11.2012
Сообщений: 7
По умолчанию

(Еще раз чтобы было совсем понятно)
Найти произведение целых чисел: a,b,c,d,e,f,g,h,i; таких что:
1) a+b;b+c;a+c;d+e;d+f;f+e;g+h;h+i;g+i - являются полными квадратами;
2) a+b+c=d+e+f=g+h+i
3)и эта сумма должна быть минимальна(пункт 2)
nba-world вне форума Ответить с цитированием
Старый 11.11.2012, 14:31   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Интересная задачка, имхо
Нашел подходящие числа перебором.
222, 454, 507, 27, 94, 1062, 283, 342, 558
Быдло-переборщик:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct three
{
    int a, b, c;
};

int
comp(const void *i, const void *j)
{
    struct three *l1 = (struct three *) i;
    struct three *l2 = (struct three *) j;
    return l1->a + l1->b +l1->c - l2->a - l2->b - l2->c;
}

int main()
{
    int n = 2000;
    struct three *list = NULL;
    int size = 0, reserve = 0;
    for (int a = 1; a <= n - 2; ++a)
    for (int b = a + 1; b <= n - 1; ++b)
    for (int c = b + 1; c <= n; ++c)
    if (trunc(sqrt(a + b)) == sqrt(a + b) &&
        trunc(sqrt(a + c)) == sqrt(a + c) &&
        trunc(sqrt(c + b)) == sqrt(c + b)) {
        if (size == reserve) {
            if (!(reserve *= 2)) reserve = 10;
            list = realloc(list, reserve * sizeof(list[0]));
        }
        list[size].a = a;
        list[size].b = b;
        list[size].c = c;
        ++size;
    }
    if (list) {
        list = realloc(list, size * sizeof(list[0]));
        qsort(list, size, sizeof(*list), comp);
        for (int i = 0; i < size; ++i) {
            printf("%d %d %d {%d}\n", list[i].a, list[i].b, list[i].c, list[i].a + list[i].b + list[i].c);
        }
        for (int i = 0; i < size - 2; ++i) {
            if (list[i].a + list[i].b + list[i].c == list[i + 1].a + list[i + 1].b + list[i + 1].c &&
                list[i + 1].a + list[i + 1].b + list[i + 1].c ==
                list[i + 2].a + list[i + 2].b + list[i + 2].c &&
                list[i].a != list[i + 1].a &&
                list[i].a != list[i + 1].b &&
                list[i].a != list[i + 1].c &&
                list[i].a != list[i + 2].a &&
                list[i].a != list[i + 2].b &&
                list[i].a != list[i + 2].c &&

                list[i].b != list[i + 1].a &&
                list[i].b != list[i + 1].b &&
                list[i].b != list[i + 1].c &&
                list[i].b != list[i + 2].a &&
                list[i].b != list[i + 2].b &&
                list[i].b != list[i + 2].c &&

                list[i].c != list[i + 1].a &&
                list[i].c != list[i + 1].b &&
                list[i].c != list[i + 1].c &&
                list[i].c != list[i + 2].a &&
                list[i].c != list[i + 2].b &&
                list[i].c != list[i + 2].c &&

                list[i + 1].a != list[i + 2].a &&
                list[i + 1].a != list[i + 2].b &&
                list[i + 1].a != list[i + 2].c &&

                list[i + 1].b != list[i + 2].a &&
                list[i + 1].b != list[i + 2].b &&
                list[i + 1].b != list[i + 2].c &&

                list[i + 1].c != list[i + 2].a &&
                list[i + 1].c != list[i + 2].b &&
                list[i + 1].c != list[i + 2].c
                ) printf("WIN %d\n", list[i].a + list[i].b + list[i].c);
        }
        free(list);
    }
    return 0;
}
Потом нужно посмотреть выходной текстовый файл (лучше выводить в файл), найти первую строчку со словом WIN, взять из нее сумму, найти эту сумму в строчках выше, выписать 9 чисел
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.11.2012 в 14:35.
BDA вне форума Ответить с цитированием
Старый 11.11.2012, 14:54   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Update (в прошлое сообщение не поместилось)
Немного дописанный вариант, который "сам" ищет числа, увеличивая область поиска.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

struct three
{
    int a, b, c;
};

int
comp(const void *i, const void *j)
{
    struct three *l1 = (struct three *) i;
    struct three *l2 = (struct three *) j;
    return l1->a + l1->b +l1->c - l2->a - l2->b - l2->c;
}

int main()
{
    int n = 200;
    long long int dwStart = GetTickCount();
    while (1) {
        struct three *list = NULL;
        int size = 0, reserve = 0;
        for (int a = 1; a <= n - 2; ++a)
        for (int b = a + 1; b <= n - 1; ++b)
        for (int c = b + 1; c <= n; ++c)
        if (trunc(sqrt(a + b)) == sqrt(a + b) &&
            trunc(sqrt(a + c)) == sqrt(a + c) &&
            trunc(sqrt(c + b)) == sqrt(c + b)) {
            if (size == reserve) {
                if (!(reserve *= 2)) reserve = 10;
                list = realloc(list, reserve * sizeof(list[0]));
            }
            list[size].a = a;
            list[size].b = b;
            list[size].c = c;
            ++size;
        }
        if (list) {
            list = realloc(list, size * sizeof(list[0]));
            qsort(list, size, sizeof(*list), comp);
            for (int i = 0; i < size - 2; ++i) {
                if (list[i].a + list[i].b + list[i].c == list[i + 1].a + list[i + 1].b + list[i + 1].c &&
                    list[i + 1].a + list[i + 1].b + list[i + 1].c ==
                    list[i + 2].a + list[i + 2].b + list[i + 2].c &&
                    list[i].a != list[i + 1].a &&
                    list[i].a != list[i + 1].b &&
                    list[i].a != list[i + 1].c &&
                    list[i].a != list[i + 2].a &&
                    list[i].a != list[i + 2].b &&
                    list[i].a != list[i + 2].c &&

                    list[i].b != list[i + 1].a &&
                    list[i].b != list[i + 1].b &&
                    list[i].b != list[i + 1].c &&
                    list[i].b != list[i + 2].a &&
                    list[i].b != list[i + 2].b &&
                    list[i].b != list[i + 2].c &&

                    list[i].c != list[i + 1].a &&
                    list[i].c != list[i + 1].b &&
                    list[i].c != list[i + 1].c &&
                    list[i].c != list[i + 2].a &&
                    list[i].c != list[i + 2].b &&
                    list[i].c != list[i + 2].c &&

                    list[i + 1].a != list[i + 2].a &&
                    list[i + 1].a != list[i + 2].b &&
                    list[i + 1].a != list[i + 2].c &&

                    list[i + 1].b != list[i + 2].a &&
                    list[i + 1].b != list[i + 2].b &&
                    list[i + 1].b != list[i + 2].c &&

                    list[i + 1].c != list[i + 2].a &&
                    list[i + 1].c != list[i + 2].b &&
                    list[i + 1].c != list[i + 2].c
                    ) {
                    printf("Numbers finded:\nSUM = %d\n", list[i].a + list[i].b + list[i].c);
                    printf("%d %d %d %d %d %d %d %d %d\n", list[i].a, list[i].b,
                           list[i].c, list[i + 1].a, list[i + 1].b, list[i + 1].c,
                           list[i + 2].a, list[i + 2].b, list[i + 2].c);
                    free(list);
                    printf("Work time: %lld ms\n", GetTickCount() - dwStart);
                    return 0;
                }
            }
            free(list);
        }
        printf("n = %d - checked\nProgram works %lld ms\n", n, GetTickCount() - dwStart);
        n += 200;
    }
    return 0;
}
Давненько не писал такого быдло-кода
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2012, 16:04   #14
nba-world
 
Регистрация: 10.11.2012
Сообщений: 7
По умолчанию

Спасибо большое за решение
nba-world вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
полный 0 в Qt и чайник в С++ _KUL Qt и кроссплатформенное программирование С/С++ 10 04.08.2012 05:39
Полный П... Jackkkk Свободное общение 2 12.01.2012 00:13
Полный экран veter48 Паскаль, Turbo Pascal, PascalABC.NET 0 02.03.2011 18:38
полный путь tae1980 Microsoft Office Excel 7 08.05.2009 10:46
Полный венигрет !!! MaxZoa Microsoft Office Excel 5 17.04.2008 09:28