Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/58: Рейтинг темы: голосов - 58, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 34
1

Найти произведение 20 первых простых чисел

05.05.2019, 15:03. Показов 10706. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Найти произведение 20 первых простых чисел
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2019, 15:03
Ответы с готовыми решениями:

Найти 100 первых простых чисел
Найти 100 первых простых чисел

Найти сумму и произведение 15 простых чисел
Найти сумму и произведение 15 простых чисел.Простым числом называют число у которого есть только...

Найти произведение первых N натуральных чисел
1)Найти сумму первых N натуральных чисел 2)Найти произведение первых N натуральных чисел

Найти произведение первых 5 нечетных натуральных чисел, не превосходящих N
1. Найти произведение первых 5 нечетных натуральных чисел, не превосходящих N. Первое число...

15
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
05.05.2019, 17:36 2
Julia Smirnova, найти факториал 20?
0
1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 34
05.05.2019, 18:36  [ТС] 3
да, именно
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
05.05.2019, 18:54 4
Julia Smirnova
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
 
n: Integer; 
f: Longint; 
 
begin
  f := 1;
  for n := 2 to 20 do 
    f := f * n;
  Write(f);
end.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
05.05.2019, 19:10 5
Цитата Сообщение от Пс Посмотреть сообщение
найти факториал 20?
Нет, именно простых чисел, типа 2*3*5*7*11*13.....
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
05.05.2019, 19:29 6
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
function Simple(x: integer): boolean;
var
  i: integer;
begin
  for i := 2 to x div 2 do
    if x mod i = 0 then
    begin
      result := false;
      exit
    end;
  result := true;
end;
 
var
  
  n: Integer; 
  f: Longint;
 
begin
  f := 1;
  for n := 2 to 8 do 
    if Simple(n) then
      f := f * n;
  Write(f);
end.
1
Модератор
10029 / 5376 / 3348
Регистрация: 17.08.2012
Сообщений: 16,387
11.05.2019, 00:56 7
Лучший ответ Сообщение было отмечено Julia Smirnova как решение

Решение

Пс, достаточно
Pascal
5
  for i := 2 to trunc(sqrt(x)) do
И программа Ваша вычисляет произведение лишь первых 4 простых чисел, что не соответствует заданию. Правильно будет, например, так:
Pascal
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  
  n, k: Integer; 
  f: Longint;
 
begin
  f := 1;
  n := 1;
  for k := 1 to 20 do
    begin 
      repeat inc(n) until Simple(n);
      f := f * n
    end;
  Write(f);
end.
Решение с применением решета Эратосфена:
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
const
  n = 20;
  m = trunc(n * (ln(n) + ln(ln(n)))); //оценка сверху n-ного простого числа (верна при n >= 6)
 
var
  s: array[2..m] of integer; //решето
  i, j, k, p: longint;
 
begin
  for i := 2 to m do s[i] := i; //заполнение решета
  i := 1; //начальная величина для поиска простого числа
  p := 1; //начальная величина произведения
  for k := 1 to n do //цикл поиска и умножения первых n простых чисел
    begin
      repeat inc(i) until s[i] > 0; //ищем в решете очередное простое число
      p := p * s[i]; //вычисляем целевое произведение
      j := i + i; //минимальное число, кратное найденному простому
      while j <= m do //цикл удаления из решета чисел, кратных найденному простому
        begin
          s[j] := 0; //удаляем
          inc(j, i) //вычисляем следующее число, кратное найденному простому
        end
    end;
  write('P = ', p); //печать результата
  readln
end.
1
1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 34
11.05.2019, 17:51  [ТС] 8
Что означает функция simple?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
11.05.2019, 17:56 9
Просто автор так назвал функцию определения простого числа (simple=>просто)
1
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
11.05.2019, 20:46 10
Puporev, фунция не моя,где-то на форуме нашел)
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
12.05.2019, 18:37 11
Cyborg Drone после проверки забыл поменять значения
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
function Simple(x: integer): boolean;
var
  i: integer;
begin
  for i := 2 to x div 2 do
    if x mod i = 0 then
    begin
      result := false;
      exit
    end;
  result := true;
end;
 
var
  
  n: Integer; 
  f: Longint;
 
begin
  f := 1;
  for n := 2 to 20 do
    if Simple(n) then
      f := f * n;
  write(f);
end.
это исправленный
0
Модератор
10029 / 5376 / 3348
Регистрация: 17.08.2012
Сообщений: 16,387
13.05.2019, 23:22 12
Нет, Пс, это ещё один неправильный вариант.

Нужно найти произведение 20 первых простых чисел, а не произведение простых чисел, меньших 20.

По условию нужно вычислить вот это:

2*3*5*7*11*13*17*19*23*29*31*37*41*43*47*53*59*61*67*71

Ваша программа вычисляет вот это:

2*3*5*7*11*13*17*19
0
98 / 36 / 18
Регистрация: 05.11.2018
Сообщений: 231
14.05.2019, 00:09 13
Лучший ответ Сообщение было отмечено Cyborg Drone как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var i,k,d:longint;
f:boolean;
p:BigInteger;
begin
  i:=2;p:=1;
  while k<=19 do
    begin
      f:=i>1;
      d:=2;
      while(f)and(d*d<=i) do
        begin
          f:=i mod d<>0;
          d:=d+1;
        end;
      if f
        then begin p:=p*i;k:=k+1;end;
        i:=i+1;
   end;
 write(p);
end.
В решениях выше нигде длинной арифметики не видел, ну или дробных чисел, так что использовал BigInteger(вроде как в PascalABC он есть).
2*3*5*7*11*13*17*19*23*29*31*37*41*43*47*53*59*61*67*71=557940830126698960967415 390
1
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,246
14.05.2019, 07:04 14
Cyborg Drone, я оказывается задание не правильно понял)
Постараюсь сегодня исправить
0
Модератор
10029 / 5376 / 3348
Регистрация: 17.08.2012
Сообщений: 16,387
15.05.2019, 21:31 15
Mikstereo, верно замечено. Любого стандартного типа, в том числе, comp, int64, uint64 и extended недостаточно для представления (в случае с extended - для точного представления) этого произведения. Я что-то беспечно не проверил это дело, и ошибочно предположил, что longint вполне хватит. Спасибо большое Вам.

Нет, biginteger в Pascal ABC нет, но это есть в Pascal ABC.NET (прям каламбур какой-то, в (этом уродце) ABC нет, а в ABC.NET не нет).

Наверное, нужно будет написать с длинной арифметикой, но сейчас у меня просто сил нет что-либо писать.
0
Модератор
10029 / 5376 / 3348
Регистрация: 17.08.2012
Сообщений: 16,387
04.02.2020, 18:22 16
Решил доделать недоделанное.

Произведение последовательности простых чисел называется "Праймориал", и обозначается pn#, где n - количество простых чисел. Так что, по заданию требуется найти p20#.

p20# = 557940830126698960967415390. В этом числе 27 десятичных разрядов. 20-е простое число равно 71, если использовать для длинной арифметики longword, можно делать перемножение по модулю 107, поскольку [(232 - 1) div 71] = 60492497 содержит 8 разрядов, следовательно, без риска целочисленного переполнения можно использовать 7 разрядов. 7*4=28 больше, чем 27, следовательно, для вычисления p20# понадобится массив из 4 элементов типа longword.

Получилось вот так:
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
function simple(x: longword): boolean;
var
  i: longword;
begin
  simple := x > 1;
  for i := 2 to trunc(sqrt(x)) do
    if x mod i = 0 then
      begin
        simple := false;
        break
      end
end;
 
const
  g = 10000000;
var
  n, i, k: longword;
  f: array[1..4] of longword;
begin
  f[1] := 1; //начальное значение произведения = 1
  for k := 1 to 20 do //цикл по номерам простых чисел
    begin
      repeat inc(n) until simple(n); //ищем очередное простое
      for i := 1 to 4 do f[i] := f[i] * n; //умножаем массив на очередное простое число
      for i := 1 to 3 do //цикл распространения переноса по модулю 10^7
      begin
        f[i + 1] := f[i + 1] + f[i] div g; //добавляем перенос к следующему элементу
        f[i] := f[i] mod g //усекаем элемент
      end
    end;
  for i := 4 downto 1 do write(f[i]) //выводим результат
end.
Чуть изменил функцию simple, потому что не изменённая функция ошибочно считает любое целое число, меньшее двух, простым числом.
Не стал инициализировать переменную n, поскольку она глобальная, и инициализируется нулём.
Не стал делать печать дополняющих до 7 разрядов нулей для элементов массива, поскольку равные нулю значащие разряды p20# расположены на позициях, не кратных 7, а программа предназначена для вычисления именно p20#. Была бы программа универсальная, тогда бы печать дополняющих нулей была бы необходима.
2
04.02.2020, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2020, 18:22
Помогаю со студенческими работами здесь

В массиве из 55 случайных чисел найти произведение шести первых элементов
3)В массиве из 55 случайных чисел принадлежащих интервалу (-15..55) найти произведение шести первых...

Функции: Найти произведение первых n простых чисел
Вредный препод дал мне такую задачку: Дано натуральное n&gt;0. Найти произведение первых n простых...

Найти k первых простых чисел
Найти k первых простых чисел \frac{1}{a} + \frac{1}{a(a + 1)} +...+ \frac{1}{a(a + 1)*...*(a + n)}

найти К первых простых чисел в арифмметической прогрессии: 21 31 41 51 61.....
ввести натуральное число К. найти К первых простых чисел в арифмметической прогрессии: 21 31 41 51...

Найти n первых простых чисел (с использованием функции)
Найти n первых простых чисел (с использованием функции)

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru