Помощь - Поиск - Пользователи - Календарь
Полная версия: Подпрограмма
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Paytinka
Найти все простые числа, не превосходящие заданного числа n, двоичная запись которых представляет собой симметричную последовательность 0 и 1.

Программа вычисляет простые числа и переводит их в двоичную систему счисления, а проблемма у меня возникла с нахождением симметрмичного двоичного числа..почему-то программа не реагирует на функцию Simmetr.
uses crt;
function FromDec(n, radix:longint):string; // перевод числа в двоичную систему счисления
var
s: String;
const
digit: string[2]='01';
 begin
  s:='';
   repeat
     s:=digit[(n mod radix)+1]+s;
     n:=n div radix;
   until n=0;
  FromDec:=s;
 end;
function Simmetr(j:integer):boolean; // проверка является ли число симметричным
  var
   i,n:integer;
   b:boolean;
   s:string;
 begin
  b:=true;
    for i:=1 to n div 2 do
      if s[j]<>s[n-j+1] then simmetr:=true
      else simmetr:=false;
 end;
// основная программа нахождения простых чисел
var n,i,k,pdel,f:integer;
    p, Code : Integer;
    Str: string;
 begin
  clrscr;
     repeat
       Write('vvedite 4islo n: ');
       Readln(str);
       Val(Str, p, Code);
         if Code<>0 then Writeln('Nepravilnij vvod! Owibka: ',Code) // проверка правильности ввода числа
         Else Writeln('Ok!');
      until Code = 0;
      n:=p;
          for i:=2 to n do
             begin
               pdel:=0;
                 for k:=2 to i do
                   if (i mod k) = 0 then pdel:=pdel+1;
                   begin
                      if pdel=1 then Write(i,' ');
                      writeln('=',fromdec(i,2)); // вывод простого числа в двоичной форме
                      writeln('=', simmetr(i)); // симметр число
                   end;
             end;
 readkey;
 end.
volvo
Функция simmetr не совсем корректно написана... Вот так попробуй:
function Simmetr(s:string):boolean;
var
  i:integer;
  b:boolean;
begin
  b:=true;
  for i:=1 to length(s) div 2 do
    if s[i]<>s[length(s)-i+1] then b:=false;
  simmetr:=b;
end;


А вызывать - вот так:
...
n:=p;
for i:=2 to n do begin

  pdel:=0;
  for k:=2 to i do
    if (i mod k) = 0 then pdel:=pdel+1;

  if (pdel=1) and (simmetr(fromdec(i, 2))) then WriteLn(i,' ', fromdec(i, 2));

end;
...
Артемий
function Simmetr(j:integer):boolean;\\проверка является ли число симметричным
var
i,n:integer;
b:boolean;
s:string;
begin
b:=true;
for i:=1 to n div 2 do
if s[j]<>s[n-j+1] then simmetr:=true
else simmetr:=false;
end;

А причем сдесь строка s? blink.gif Что она сдесь выполняет?И n: ты даешь ему хоть одно значение?
volvo
P.S. Paytinka, тегами пользуйся...
Paytinka
Volvo, спасибо тебе огромное за помощь!!!! теперь все работает отлично!!! !flowers.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.