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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2010, 13:46   #1
valis
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 17
По умолчанию Pascal. Последовательность хемминга

Последовательность хемминга - расположенные в возрастающем порядке числа,не имееющих простых делителей,откличных,к примеру от 2,3,5.
Простые числа,напомню,числа которые делятся только сами на себя и единицу

В условии задачи дан исходный фаил Input.txt, содержащий в себе 3 простых числа и N-ый элемент последовательности.
Найти N-ый элемент последовательности

Порыскал в интернете,нашел этот код. Он предназначен для простых чисел 2,3,5.
А мне нужно для любых простых чисел.
Пример input.txt должен быть вида p1 p2 p3 n
input.txt:7 13 19 100 output.txt 26590291
input.txt:3 5 7 5 output.txt 15
. Откровенно говоря,очень слаб в паскале и не могу подкорректировать его под свое задание.
Код:
uses crt;
function Prost(n:longint):boolean;{определение простого числа}
var i:longint;
begin
Prost:=true;
for i:=2 to round(sqrt(n))do{от двух до корня из числа}
if n mod i=0 then{если на что-то делится}
 begin
  Prost:=false;{не простое}
  break;{дальше не проверяем}
 end;
end;
function Hemming(n:longint):boolean;{определение Хемминга}
var i:longint;
begin
Hemming:=true;
for i:=7 to n div 2 do{от 7(меньше допустимо)до середины числа}
if Prost(i)and not(i in [2,3,5]) and(n mod i=0) then{если простое и на него можно делить}
 begin
  Hemming:=false;{не Хемминг}
  break;{дальше не ищем}
 end;
end;
var n,a,k:integer;
begin
clrscr;
write('n=');readln(n);
a:=1;k:=1;
while k<=n do
 begin
  inc(a);
  {если число делится на 2,3,5 и больше ни на одно простое}
  if ((a mod 2=0)or(a mod 3=0)or(a mod 5=0)) and Hemming(a) then
   begin
    inc(k);{считаем}
    write(a,' ');{это просто для проверки, можно убрать}
   end;
 end;
writeln;
write('Hemming(',n,')=',a);
readln
end.
Помогите пожалуйста=)
valis вне форума Ответить с цитированием
Старый 19.10.2010, 15:47   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а объясните, зачем Вам даны исходные три простых числа?!
Как они тут участвуют в получении последовательности?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2010, 07:38   #3
valis
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 17
По умолчанию

Ну одно из трех(может быть два из трех,три из трех) данных чисел является делителем .
Предположим в файле input.txt даны три числа 3 5 7,все они являются простыми .
итак,к примеру перебор:
2-не подходит,т.к делится на простое число 2
3-подходит,по условию
4-не подходит,т.к делится на простое число 2(по условию может делиться из простых чисел только на 3,5,7)

5-подходит по усл
6-не подходит,т.к делится на простое число 2,а это уже не соответствует условию,хоть и есть простой делитель 3
7-подходит по усл
8-не подходит,т.к делится на простое число 2(по условию может делиться из простых чисел только на 3,5,7)
9-подходит т.к как делится на только на 3,а3 есть в условии
10-не подходит,т.к делится на простое число 2(по условию может делиться из простых чисел только на 3,5,7)
..
..
..
19-не подходит,т.к простое
ну и т.п.
valis вне форума Ответить с цитированием
Старый 20.10.2010, 10:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ААА!
я кажется понял.
Вам нужно найти НЕ последовательность Хемминга
а числовую последовательность, которая образована числами,
не имееющих простых делителей,откличных от p1 p2 p3

Так просто вместо
2 3 5 подставьте в алгоритм p1 p2 p3 и всё!

Последний раз редактировалось Serge_Bliznykov; 20.10.2010 в 10:28.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2010, 11:46   #5
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Вот так как-то. Проверяй сам. На числах 2,3,5 последовательность Хемминга генерирует правильно.

Код:
uses crt;
var
 n,a,k:longint;
 p1,p2,p3 : longint;

function Prost(n:longint):boolean;{определение простого числа}
var i:longint;
begin
Prost:=true;
for i:=2 to round(sqrt(n))do{от двух до корня из числа}
if n mod i=0 then{если на что-то делится}
 begin
  Prost:=false;{не простое}
  break;{дальше не проверяем}
 end;
end;

function Hemming(n:longint):boolean;{определение Хемминга}
var i:longint;
begin
Hemming:=true;
for i:= 2 to n do
 begin
 if (n mod i) = 0 then // делитель
  if Prost(i) then // простой делитель
   if (i <> p1) and (i <> p2) and (i <> p3) then
   begin
   Hemming:=false;
   Exit;
   end;
 end;
end;

begin
clrscr;
write('n=');readln(n);
write('p1=');readln(p1);
write('p2=');readln(p2);
write('p3=');readln(p3);
if not Prost(p1) then begin write('Делитель p1 не простое число. Условие задачи не выполнено.Програма завершена.');Exit; end;
if not Prost(p2) then begin write('Делитель p2 не простое число. Условие задачи не выполнено.Програма завершена.');Exit; end;
if not Prost(p3) then begin write('Делитель p3 не простое число. Условие задачи не выполнено.Програма завершена.');Exit; end;
a:=1;k:=1;
while k<=n do
 begin
  inc(a);
  if Hemming(a) then
   begin
    inc(k);{считаем}
    write(a,' ');{это просто для проверки, можно убрать}
   end;
 end;
writeln;
write('Hemming(',n,')=',a);
end.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 20.10.2010, 15:39   #6
valis
Пользователь
 
Регистрация: 29.09.2008
Сообщений: 17
По умолчанию

Огромное спасибо! Очень благодарен
valis вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
код Хемминга pinch000 Общие вопросы C/C++ 1 19.12.2009 20:41
код Хемминга pinch000 Помощь студентам 0 19.12.2009 18:59
Коды Хемминга =LeonZone= Помощь студентам 1 27.11.2008 13:19