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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2010, 21:43   #1
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию Найти все делители числа N

Уважаемые программисты.
Изначально я прописала код, который просто рассчитывает делители, потом преподаватель попросил сделать так, чтобы писались по 2 делителя - самый левый и самый правый. Но после этого,а именно после того, когда я сделала программу, преподаватель добавил строчку writeln ('try',i) после которой помимо делителей пишутся остальные числа, которые программа перебирает. Удаление этой строчки не позволительна и преподаватель сказал, что мне надо изменить условие цикла, чтобы этот перебор не писался. Вся работа в Pascal.
Вот программа:

Код:
var number,i,t:longInt;
begin
writeln('vvedite chislo);
readln(number);
writeln;
writeln('delitel chisla');
i:=1;
t:=number;
while i<t do
begin
if (number mod i=0) then
begin
writeln(i);
t:=number div i;
writeln (t);
end;
i:=i+1
writeln ('try',i);      <------ ВОТ ЧТО ОН ДОПИСАЛ !
end;
readln;
end.

Последний раз редактировалось Stilet; 03.11.2010 в 08:26.
torah вне форума Ответить с цитированием
Старый 02.11.2010, 21:56   #2
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

ну скажем можно искать до round(N/2),
например для 50 не имеет смысла искать делители начиная с 26 - точно не найдем

для 70-и с 36 точно можно не искать. То есть цикл достаточно сделать до N/2. может он это имел ввиду?
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Старый 02.11.2010, 22:12   #3
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Можно попробовать так:

Код:
label e;
var number,i,t:longInt;
begin
writeln('vvedite chislo');
readln(number);
writeln;
writeln('delitel chisla');
i:=1;
t:=number;
while i<t do
begin
e: i:=i+1;
if (number mod i=0) then
begin
writeln(i);
t:=number div i;
writeln (t);
end
else goto e;
writeln ('try',i);     
end;
readln;
end.
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 02.11.2010, 22:16   #4
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию

Я просто уже не знаю, куда можно ещё больше её улучшать.
torah вне форума Ответить с цитированием
Старый 02.11.2010, 22:16   #5
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Цитата:
например для 50 не имеет смысла искать делители начиная с 26 - точно не найдем

для 70-и с 36 точно можно не искать
А как же 50 - это тоже делитель 50!
А 70 - делитель 70!
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 02.11.2010, 22:37   #6
Macmeprag
Пользователь
 
Аватар для Macmeprag
 
Регистрация: 07.10.2010
Сообщений: 43
По умолчанию

самый левый - это поидее тот что первым найдется, а самый правый - это собсна само число, разве не так?
тогда надо сделать брейк цикла как только встретится первый делитель
А если и не так (самый правый - самый большой, но отличный от самого числа), то можно после того как только найдет самый первый сделать обратный цикл..
Код:
var
  number,i,t:longInt;
begin
  writeln('Vvedite chislo');
  readln(number);
  writeln;
  writeln('Delitel chisla');
  i:=1;
  t:=number;
  while i<number div 2 do begin
    inc(i);
    if (number mod i=0) then begin
      if i=2 then begin
        WriteLn('Edinstvenny ',i);
        break;
      end;
      writeln('Samyi levyi ',i);
      break;
    end
    else continue;
    writeln ('try',i);
  end;
  for i:=number div 2 downto 1 do
    if number mod i = 0 then begin
      if i=2 then break;
      WriteLn('Samyi pravyi ',i);
      break;
    end;
  readln;
end.
Никогда не используйте лейблы) они-зло

Последний раз редактировалось Macmeprag; 02.11.2010 в 22:41.
Macmeprag вне форума Ответить с цитированием
Старый 02.11.2010, 22:40   #7
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию

Macmeprag, если я использую break, тогда он попросит избавиться от него ( уж такие у него нравы ), т.е. у преподавателя. Программа у меня правильно работает, я просто не знаю, как от этих строчек избавиться, ведь если я её просто удалю - он вновь её напишет )
torah вне форума Ответить с цитированием
Старый 02.11.2010, 22:44   #8
Macmeprag
Пользователь
 
Аватар для Macmeprag
 
Регистрация: 07.10.2010
Сообщений: 43
По умолчанию

Ы
Код:
inc(i);//<=> i:=i+1;
continue;
континью хоть не удалит?
бредовый препод на самом деле тогда) а лейблы он принимает? если да, то я вообще разочарован
Macmeprag вне форума Ответить с цитированием
Старый 02.11.2010, 22:48   #9
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию

На счет лейблов - не знаю, но люди на курс старше до сих пор ему лабы сдают ... Поэтому я в печали. Если ему придёт в голову, что можно улучшить программу - то все, уловить его мысль очень сложно.

Последний раз редактировалось torah; 02.11.2010 в 22:50.
torah вне форума Ответить с цитированием
Старый 02.11.2010, 22:50   #10
Macmeprag
Пользователь
 
Аватар для Macmeprag
 
Регистрация: 07.10.2010
Сообщений: 43
По умолчанию

на сколько я знаю..3 способа избежать эту фигню..брейк, лейбл и континью
Macmeprag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти все простые числа в заданном диапазоне Nikita++ Помощь студентам 8 20.10.2010 20:05
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49