Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
9 / 9 / 0
Регистрация: 17.01.2013
Сообщений: 87

Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром

13.06.2015, 01:34. Показов 7486. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром, т.е. читается одинаково слева направо и справа налево
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2015, 01:34
Ответы с готовыми решениями:

Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром
5. Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром, т. е. читается...

Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром
Здравствуйте! Помогите решить задачу в VBA. Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет...

Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром
Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром, т.е. читается одинаково...

10
 Аватар для ВаЛерика
121 / 26 / 27
Регистрация: 17.04.2013
Сообщений: 106
13.06.2015, 16:15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function simple(n : integer) : boolean;
   var i, max : integer; f : boolean;
   begin
      i := 2;
      max := round(sqrt(n));
      f := n <> 1;
      while i <= max do begin
         if n mod i = 0 then begin
            f := false;
            break
         end;
         i := i + 2;
      end;
      simple := f
   end;
   
function oborot(s:string): string; 
var i: integer; s1: string;
begin
s1:='';
for i:=1 to length(s) do 
  s1:=s[i]+s1;
oborot:=s1;
end;
   
function x(n: integer): boolean;   
var s:string;
begin
s:='';
while n>0 do
 begin
  s:=chr(n mod 2+48)+s;
  n:=n div 2;
 end;
 //writeln (s);
if s<>oborot(s) then x:=false
else x:=true;
end;   
 
var n, i : integer;
begin
   write('n = '); 
   readln(n);
   for i := 1 to n do
      if simple(i) then 
        if x(i) then write(i, ' ');
   writeln;
end.
0
54 / 45 / 97
Регистрация: 17.08.2014
Сообщений: 157
13.06.2015, 16:18
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
program ex;
var  i,k,n,count: word;
z,err:integer;
  
function dec2bin(x:integer):string;
var s:string;
begin
  s:='';
  while x>0 do
  begin
     s:=chr(ord('0')+x mod 2)+s;
     x:=x div 2;
  end;
dec2bin:=s;
end;
 
function palindrom(var a:integer):integer;
var b,c:integer;
begin
b:=a;
c:=0;
while b>0 do
 begin
  c:=c*10+(b mod 10);
  b:=b div 10;
 end;
if c=a then palindrom:=1
       else  palindrom:=0;
end;
 
begin
  readln(n);
  for k := 1 to n do begin
    count := 0;
    for i := 1 to k do begin
      if k mod i = 0 then inc(count)
    end;
    if count = 2 then (*write(k, ' ')*)
                  begin
                  val(dec2bin(k),z,err);
                  if (palindrom(z)=1) then
                  writeln(k);
                  end;
  end
end.
0
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 42
17.08.2019, 18:41
подскажите, почему максимальное корректно работающее число это 1023. Все числа, следующие за ним не переводятся из строки в число. Для проверки этого явления переделал немного код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program 123;
var  n: longint; //2147483647
z,err:integer;
  
//перевод в двоичную систему счисления
function bin(x:integer):string;
var s:string;
begin
  s:='';
  while x>0 do
  begin
     s:=chr(ord('0')+x mod 2)+s;
     x:=x div 2;
  end;
bin:=s;
end;
 
begin
read(k);
       val(bin(k),z,err); 
       writeln(bin(k)); // двоичная запись числа в строке
       writeln('Двоичная запись: ',z);
end.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
17.08.2019, 20:23
Значит Вы не так написали:
3 11
5 101
7 111
17 10001
31 11111
73 1001001
107 1101011
127 1111111
257 100000001
313 100111001
443 110111011
1193 10010101001
1453 10110101101
1571 11000100011
1619 11001010011
1787 11011111011
1831 11100100111
1879 11101010111
4889 1001100011001
5113 1001111111001
5189 1010001000101
5557 1010110110101
5869 1011011101101
5981 1011101011101
6211 1100001000011
6827 1101010101011
7607 1110110110111
7759 1111001001111
7919 1111011101111
8191 1111111111111
17377 100001111100001
18097 100011010110001
18289 100011101110001
19433 100101111101001
19609 100110010011001
19801 100110101011001
21157 101001010100101
22541 101100000001101
22669 101100010001101
22861 101100101001101
23581 101110000011101
24029 101110111011101
25747 110010010010011
25939 110010101010011
27179 110101000101011
27803 110110010011011
28123 110110111011011
28219 110111000111011
28807 111000010000111
29671 111001111100111
0
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 42
19.08.2019, 15:00
Как и в прошлом моём сообщении больше 1023 числа не переводятся из строки в число. Посмотрите пожалуйста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
program fff;
var  i,k,n,count: longint; 
z,err:integer;
var f: text;
  
//перевод в двоичную систему счисления 
function bin(x:integer):string;
var s:string;
begin
  s:='';
  while x>0 do
  begin
     s:=chr(ord('0')+x mod 2)+s;
     x:=x div 2;
  end;
bin:=s;
end;
 
//проверка числа на палиндромность
function palindrom(var a:integer):integer;
var b,c:integer;
begin
b:=a;
c:=0;
while b>0 do
 begin
  c:=c*10+(b mod 10);
  b:=b div 10;
 end;
if c=a then palindrom:=1
       else  palindrom:=0;
end;
 
begin
  assign(f, 'output.txt');
  rewrite(f);
  
  readln(n);
  for k := 1 to n do begin
  count := 0;
    for i := 1 to k do begin
      if k mod i = 0 then begin
        inc(count);
        if count>2 then break;
      end;
    end; 
  if count = 2 then begin  //если число простое, то проверяем его на палиндромность begin
                        val(bin(k),z,err); //Перевод из строки в число.
                        if (palindrom(z)=1) then begin
                          write('Число: ',k,' ');
                          write(f, 'Число: ',k,' ');
                          writeln('Двоичная запись: ',z);
                          writeln(f, 'Двоичная запись: ',z);
                        end;
                    end;     
  end;
  close(f);
end.
Сейчас уже всё другим способом сделал, всё работает, но разобраться интересно. И ещё вопрос, почему если я установил тип переменной integer, то программа позволяет ввести значение равное 2147483647 cоответствующее уже типу longint?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
19.08.2019, 15:29
В Паскаль АВС integer=longint.
1
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 42
21.08.2019, 23:19
В первом комментарии была допущена ошибка, я её исправил. Но сейчас не могу разобраться с другой проблемой. Последнее обрабатываемое число 33532927. После него ничего не происходит. Ума не приложу в чём проблема!
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function simple(n : integer) : boolean;
   var i, max : integer; f : boolean;
   begin
      i := 2;
      max := round(sqrt(n));
      f := n <> 1;
      while i <= max do begin
         if n mod i = 0 then begin
            f := false;
            break
         end;
         i := i + 1;
      end;
      simple := f
   end;
   
function oborot(s:string): string; 
var i: integer; s1: string;
begin
s1:='';
for i:=1 to length(s) do 
  s1:=s[i]+s1;
oborot:=s1;
end;
   
function x(n: integer): boolean;   
var s:string;
begin
s:='';
while n>0 do
 begin
  s:=chr(n mod 2+48)+s;
  n:=n div 2;
 end;
 //writeln (s);
if s<>oborot(s) then x:=false
else x:=true;
end;   
 
var n, i : integer;
begin
   write('n = '); 
   readln(n);
   for i := 1 to n do
      if simple(i) then 
        if x(i) then writeln(i, ' ');
   writeln;
end.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
22.08.2019, 11:01
Не правда ваша!
Программа продолжает работать и через некоторое время начинает выдавать значения с 67 260 929…
Только посчитайте-ка, сколько значений будет обработано между этими двумя числами?

67 260 929 – 33 532 927 = 33 728 002

Это больше, чем у вас было посчитано с начала!

Во-первых, вы превращаете число в строку и потом эту строку инвертируете. Это очень долго!
Могу предложить простую операцию по перевороту числа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
function reverse(n : Integer) : Integer;
var
  r : Integer;
begin
  r := 0;
  while n > 0 do
    begin
      r := r shl 1 + n and 1;
      n := n shr 1;
    end;
  reverse := r;
end;
Ну и проверка простоты числа — это ещё более долгий процесс.
Так зачем его выполнять перед переворотом чисел?
Т.е. для увеличения скорости основную программу можно переделать так:
Pascal
40
41
42
43
44
45
46
47
48
var
  n, i : Integer;
begin
  Write('n = '); ReadLn(n);
  for i := 3 to n do
    if i = reverse(i) then
      if simple(i) then
        WriteLn(i);
end.
Если присмотреться к двоичному представлению нужных нам чисел (https://www.cyberforum.ru/post13776338.html), то можно увидеть следующую закономерность:
числа можно представить так: [прямая последовательность бит][одно из: '' - пусто, 0 или 1][обратная последовательность бит]
т.е. если число=1, то получаем три числа: 11, 101, 111
следующее число=2 или 10 в 2-ой СС — три числа: 1001, 10001, 10101
следующее число=3 или 11 в 2-ой СС — три числа: 1111, 11011, 11111

Таким образом мы можем гораздо быстрее генерировать нужные там числа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure Gen(n : Integer; var v, v0, v1 : Integer);
begin
  v := n; v0 := n shl 1; v1 := n shl 1 + 1;
  repeat
    v  := v  shl 1 + n and 1;
    v0 := v0 shl 1 + n and 1;
    v1 := v1 shl 1 + n and 1;
    n := n shr 1;
  until n = 0;
end;
 
var
  n, i, v, v0, v1 : Integer;
begin
  Write('n = '); ReadLn(n);
  i := 1;
  repeat
    Gen(i, v, v0, v1);
    if simple(v ) then WriteLn(v );
    if simple(v0) then WriteLn(v0);
    if simple(v1) then WriteLn(v1);
    inc(i);
  until v1 >= n;
end.
Вот так мы увеличили скорость программы до такой степени, что теперь она основное время тратит на вывод, а не на поиск!
;–)

… И это ещё без оптимизации проверки простоты чисел.
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
22.08.2019, 12:37
Тип integer (целый). Значения этого типа занимают 4 байта и находятся в диапазоне от -2'147'483'648 до 2'147'483'647.
Цитата Сообщение от Sasha5289 Посмотреть сообщение
33'532'927
А дальше число пререходит в отрицательное, а оно не может быть простым.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
22.08.2019, 14:06
Constantin Cat, следующее число 67 260 929. Ему ещё очень далеко до отрицательного!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2019, 14:06
Помогаю со студенческими работами здесь

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

Найти все простые числа, не превосходящие натуральное число N, двоичная запись которых представляет собой палиндром
Ее условия Найти все простые числа, не превосходящие натуральное число*N,*двоичная запись которых представляет собой...

Найти все такие простые числа, не превосходящие заданного N, двоичная запись которых представляет собой симметричную
Найти все такие простые числа, не превосходящие заданного N, двоичная запись которых представляет собой симметричную последовательность...

Найти простые числа, двоичная запись которых представляет собой палиндром
найти все простые натуральные числа не превосходящие пи ,двоичная запись которых представляет собой палиндром,т.е. читается одинаково слева...

Найти простые натуральные числа запись которых представляет собой палиндром
Задание: Найти все простые натуральные числа, не превосходящие n, запись которых представляет собой палиндром, т.е. читается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru