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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2009, 16:57   #1
Александр Елис
Пользователь
 
Регистрация: 18.08.2009
Сообщений: 70
По умолчанию Помогите модернизировать программу

Уважаемые программисты, просьба подсказать простое решение следующей проблемы: нужно модернизировать программу, которая по заданной площади прямоугольника находит возможные длины его сторон(натуральные числа). Ниже привожу свой код(C):
Код:
                       while(1)
                          {
                                  printf("Please enter a natural:\t");
                                  scanf("%d", &natural);
                                  if(natural<=0)
                                  printf("Entered value isn't correct.\n");
                                  else break;
                          }
                          int a,b;
                          for(a=1;a<=natural;a++)
                          {
                                  for(b=1;b<=natural;b++)
                                  {
                                                  if(a*b==natural)
                                                  printf("Rectangle: %d,%d.\n",a,b);       
                                  }
                          }
Программа выводит на экран возможные длины его сторон, но, к примеру, выводит как 5 на 4 так и 4 на 5, что по сути одно и тоже. Это необходимо убрать. Можно, конечно, создавать массив со значениями сторон, потом делать сравнение a = b && b = a и исключать такие варианты, но нельзя ли реализовать это попроще?(сложности в реализации этого пути не вижу, но, вероятно, есть путь попроще).
Александр Елис вне форума Ответить с цитированием
Старый 18.10.2009, 17:08   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
float x=pow((double)natural,0.5);
for(int a=1;a<=x;a++)
{
    if(natural%a==0)
    {
        printf("Rectangle: %d,%d.\n",a,natural/a);
    }
}
counter вне форума Ответить с цитированием
Старый 18.10.2009, 17:10   #3
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Да, можно проще. Делаем второй цикл от а, а не от 1, и тогда второе число всегда будет не меньше первого.

Или, как в варианте counter'а, переделываем с квадратического алго в линейный. Но это уже будет не оптимизация, а правильное решение.

Последний раз редактировалось Stilet; 19.10.2009 в 09:00.
LeBron вне форума Ответить с цитированием
Старый 18.10.2009, 17:25   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а чем плоха оптимизация до правильного варианта?
counter вне форума Ответить с цитированием
Старый 18.10.2009, 17:43   #5
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

counter, я глупость написал, даже не лиенейный, а O(sqrt(N)). Нет, реализация хороша, оптимизация тоже. Просто надо еще учесть, что это за задание. Как я понимаю, задали в универе... Если задача просто выглядела, как условие, которое выложил топикстартер, то так и надо делать. А если, скажем, препод сказал "сделать с помощью вложенных циклов" или еще что-то в этом роде, то уже не то. Возможно, именно задание из первого поста данной темы - это и есть задача из универа, а не проблема, которая возикла в процессе ее решения. Я просто на всякий случай предупредил топикстартера, если ему действительно нужна была именно оптимизация даного кода, а не оптимизация алго, то пускай знает.

Последний раз редактировалось LeBron; 18.10.2009 в 21:48.
LeBron вне форума Ответить с цитированием
Старый 18.10.2009, 21:44   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

LeBron, не стоит волноваться по этому поводу! Автор, собсно, и назвал тему "...модернизировать программу", т.е. его устроит и его вариант решения, только немного усовершенствованный (ваше предложение вполне законно!).
Но поскольку автора еще интересовало решение попроще, то тут мое решение в самый раз... правда с небольшим уточнением

Код:
float x=pow((float)natural,0.5);
counter вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57
Модернизировать код, сделать его быстрее Rusl92 Общие вопросы Delphi 5 03.11.2008 19:23
Помогите дописать программу cL1zMa Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2008 14:40
Предлагаю модернизировать структуру форумов Aero_cobra О форуме и сайтах клуба 12 12.03.2008 14:26