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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 17:43   #1
Holy_Melan
 
Регистрация: 10.06.2011
Сообщений: 4
Вопрос Задача

Здравствуйте, форумчане))
Я только начинаю изучать C#, поэтому прошу помощи))
У меня есть задача, она казалась бы простая, но....
Условие:
Пифагоровы числа - это тройка натуральных чисел a, b, c, такая, что a^2 + b^2 = c^2.
Известно, что a, b, c - пифагоровы числа, a < b < c и a + b + c = 11000. Чему равно минимальное произведение a*b*c?

Вот такой у меня получился код:
Код HTML:
using System;

class Program
{
    static void Main(string[] args)
    {
        long d = 0;
      
            for (int a = 1; a < 11000; a++)
            {
                for (int b = 1; b < 11000; b++)
                {
                    for (int c = 1; c < 11000; c++)
                    {
                        if ((a + b + c == 11000)&&(a*a+b*b==c*c))
                        {
                          
                                d = a * b * c;
                               
                                Console.WriteLine(d); goto end;
                           
                        }
                    }
                }
            }

        end:
        Console.ReadKey();
    }

}
Искомое число не появляется.(
В чем проблема?

Последний раз редактировалось Holy_Melan; 10.06.2011 в 17:46.
Holy_Melan вне форума Ответить с цитированием
Старый 10.06.2011, 17:54   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Может, таких чисел и нет?

Кстати, у Вас не учтено условие a < b < c, и выбор минимального d.
ds.Dante вне форума Ответить с цитированием
Старый 10.06.2011, 18:34   #3
Holy_Melan
 
Регистрация: 10.06.2011
Сообщений: 4
По умолчанию

ds.Dante,
Спасибо за ответ))
Возможно это неправильно, но
предполагается, что первое полученное d и будет минимальным...
Если оно находиться, программа выходит из цикла.
А вот a<b<c я действительно не учла...
Подумаю еще...
Holy_Melan вне форума Ответить с цитированием
Старый 10.06.2011, 18:48   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Знаете почему программа ничего не выводит? Да потому, что число случаев в этой задаче порядка 1000000000000(ну или что-то около того). Проверять столько случаев очень долго, особенно используя консольное приложение.
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.06.2011, 18:50   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Искомое число не появляется

вобще-то 1'331'000'000'000 итераций цикла — это часа на 3-4 расчётов..
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 10.06.2011, 18:54   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

veniside
если пользовать алгоритм с 1 поста, то вы правы насчёт кол-ва итераций.
но если так
Код:
 for (int a = 1; a < 11000; a++)
            {
                for (int b = a+1; b < 11000; b++)
                {
                    for (int c = b+1; c < 11000; c++)
                    {
                        if ((a + b + c == 11000)&&(a*a+b*b==c*c))
                        {
                          
                                d = a * b * c;
                               
                                Console.WriteLine(d); goto end;
                           
                        }
                    }
                }
            }
то поменьше.
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.06.2011, 18:54   #7
Holy_Melan
 
Регистрация: 10.06.2011
Сообщений: 4
По умолчанию

_-Re@l-_, veniside, спасибо))
Значит это куда сложнее, чем я думала...)
Holy_Melan вне форума Ответить с цитированием
Старый 10.06.2011, 19:09   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да вроде ниче сложного, надо просто подумать, что если a и b известны, то крутить цикл по с — пустая трата ресурсов:

Код:
    class Program
    {
        static void Main()
        {
            //
            long d = (long)11000 * 11000 * 11000;
            for (long a = 1; a < 11000; a++) 
            {
                for (long b = a + 1; b < 11000; b++)
                {
                    long c = (long)Math.Sqrt(a * a + b * b);
                    if ((c > b) && (c + a + b == 11000) && (c*c == a*a + b*b))
                    {
                        if (a * b * c < d) 
                            //
                            d = a * b * c;
                    }
                }
            }
            //
            Console.WriteLine(d);
        }
    }
минимальное d = 24997500000 при a = 1000, b = 4950, c = 5050
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 10.06.2011 в 19:19.
veniside вне форума Ответить с цитированием
Старый 11.06.2011, 20:41   #9
Holy_Melan
 
Регистрация: 10.06.2011
Сообщений: 4
По умолчанию

veniside, спасибо))
Holy_Melan вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51
Задача C ProgramerBeatz Общие вопросы C/C++ 6 08.06.2009 01:31