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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2008, 09:41   #11
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

а можно еще и вот так организовать поиск
Код:
 var f:array[1..100000] of boolean;
                   n, i, j :integer;

//....

 readln(n);
 f[1]:= false; // 1 не является простым числом
 for i:= 2 to n do f[i]:= true;

 for i:= 2 to round(n/2) do 
 if (f[i]) then
   begin
     j:= i+i;
     while(j <= n)do
     begin
       f[j]:= false;
       j:= j + i;
     end;
   end;

 writeln('DONE!');

 for i:=1 to n do
   if (f[i]) then
    writeln(i);
никаких претензий к вышенаписанным алгоритмам нет, просто этот работает в разы быстрее
Учиться, учиться и еще раз учиться

Последний раз редактировалось Ламер_001; 28.11.2008 в 09:43.
Ламер_001 вне форума Ответить с цитированием
Старый 29.11.2008, 22:51   #12
Verochka
Пользователь
 
Регистрация: 18.11.2008
Сообщений: 16
По умолчанию

ну я вроде поняла что-то,только у меня вопрос,может и глупый,но все же,что такое Round и Break и в чем их смысл,т.е для чего они в программе,как они работают???насчет симметричности...у меня по этому поводу есть только одна мысль,раз последовательность начинается еденицей,то число не делится нацело на 2 и это все,что я могу сказать,больше у меня к сожалению нет никаких мыслей по этому поводу:-((((
Verochka вне форума Ответить с цитированием
Старый 30.11.2008, 12:36   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Round - округление. В данном случае нужно для того, что цикл может продолжаться только до целого числа. К тому же не просто целого по значению, а целого по типу (Integer и т.п.).
Break - принудительный выход из цикла.

На счет симетрии. Любое число представлено в памяти как набор байт. Например для типа Word это два байта. Таким образом число 4581 будет в памяти хранится как $11E5 = 00010001 11100101. Как же нам понять, что набор бит симметричен или нет. Для этого нам понадобится функция AND. Это не просто логическая функция над операторами типа Boolean. Для двух наборов бит она поочередно сравнивает каждый бит. Напримен:

11110000 00101100 and 10100101 11011010 = 10100000 00001000

Спомощью логического умножения (AND) можно определить значение любого бита. Для этого нужно логически перемножить два числа. Первое - искомое. Второе - число с известными битами. Например, мы знаем что число два - это 00000010, т.е. второй бит равен 1. Теперь если
X and 2 = 2
то в числе X второй бит тоже равен 1, а если
X and 2 = 0
то в числе X второй бит равен 0.
Sibedir вне форума Ответить с цитированием
Старый 01.12.2008, 17:55   #14
Verochka
Пользователь
 
Регистрация: 18.11.2008
Сообщений: 16
По умолчанию

ну насчет симметричности я поняла,а по задаче что мне надо сделать?мне так все сложно кажется...как мне написать программу?в моей программе искомым числом что будет?N?а что второе число?мне его самой надо писать?оно произвольное?мне с помощью цикла это решать?и как задать,что первое число еденицей начинается?ох сколько вопросов за раз!:-)
Verochka вне форума Ответить с цитированием
Старый 02.12.2008, 20:30   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
а что второе число?мне его самой надо писать?оно произвольное?
Что еще за второе число. Задание внимательно читайте
Цитата:
Найти все такие простые числа,не превосходящие заданного N...
Выша задача проверить каждое число от 2 до N на соответствие двум условиям:
1. число простое
2. двоичная запись числа представляет собой симметричную последовательность нулей и единиц

Проверять является ли первый бит единицей не надо, ибо если он =0, то число делится на 2.

Код:
for i := 2 to N do begin
  if {Проверка 1} then 
    if {Проверка 2} then {Сохраняем число в списке результатов}
end;
На счет простых чисел вы поняли, на счет симметрии вроде тоже. Могу лишь еще кое-что подсказать. Вопервых, для вышей задачи лучше использовать типы Word или Cardinal. Ибо с типом Integer могут возникнуть проблемы. Дело в том, что для типа Cardinal набор бит 10000000000000000000000000000001 соответствует числу 2147483649, а для типа Integer числу -2147483647. Для типа Integer вообще все числа, последний бит которых равен 1 отрицательны.
Это легко проверить:
Код:
var
  i: Integer;
  c: Cardinal;
begin
  c := 2147483649;
  i := Integer (c);
  ShowMessage (IntToStr (i));
end;
P.S.: В последовательности бит 100.......000 первым идет 0. Ибо биты и байты в компьютере нумеруются не так как мы их пишем, а с конца, тоесть по старшенству. Первым идет самый младший.

Последний раз редактировалось Sibedir; 02.12.2008 в 20:32.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разложение числа на простые множители artem_MG Паскаль, Turbo Pascal, PascalABC.NET 3 24.10.2008 19:28
Простые числа werser Помощь студентам 8 18.06.2008 07:24
Delphi и простые числа razoom Фриланс 6 13.02.2008 14:09
простые числа Акашаев Нурлан Паскаль, Turbo Pascal, PascalABC.NET 2 05.12.2007 12:23