Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 19

Неверная работа программы с рекурсией

09.10.2017, 22:43. Показов 929. Ответов 12

Студворк — интернет-сервис помощи студентам
Помогите найти ошибку. Программа выводит "Введите число 378
378=2*2*94*2*47*2*2*2*2*2*", когда должна выводить "Введите число 378
378=2*3*3*3*7". Особенность этой задачи в том, что она должна быть решена с помощью рекурсии

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
function isPrime(n:integer):boolean; // проверка простой ли множитель
begin
var count:= 0;
var k:=2;
while (k*k<2) and (count = 0) do
begin
if n mod k = 0 then
count:= count + 1;
k:=k + 1;
end;
isPrime:= (count = 0);
end;
 
 
Function Simpl (Main,SimpleFirst:integer):integer; // разложение на простые множители 
begin
  var Modd:integer;
  var Chet:=0;
    If SimpleFirst = 0 then
    SimpleFirst:= SimpleFirst+2;
    If isPrime(SimpleFirst) then
    Begin
    while (Modd = 0) do
      Begin
          Modd:= Main mod SimpleFirst;         
          Main:= Main div SimpleFirst;
          inc(Chet);
      end;
    
    For var i:=1 to Chet do
    Begin
    Write(SimpleFirst, '*')
    end;
    
    var Mnoj:= SimpleFirst;
    var Rezult:= Mnoj * Simpl(SimpleFirst + 1, Main);
if Rezult = Main then
exit
    end
    else
    begin
    Simpl(SimpleFirst + 1, Main)
    end;
end;
begin // основная программа
var SimpleFirst:integer;
var Main:= readlnInteger ('Введие число');
Write (Main, '=');
Simpl(Main, SimpleFirst);
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2017, 22:43
Ответы с готовыми решениями:

Ошибки при запуске программы из другой программы - неверная рабочая директория
Вот у меня есть несколько программ написанных под VisualBasic.net. После чего, я создаю спец программу, которая по нажатию кнопок...

Таймер и неверная логика программы
Доброй ночи всем! Есть беда. Пусть &quot;а&quot; - глобальная переменная, при нажатии клавиши &quot;стрелка влево&quot; эта переменная ...

Неверная работа if
Добрый вечер.Я только начинаю изучать работу с файлами на C++, и решил написать программу,которая записывала в txt файл Имя Автора и...

12
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 19
09.10.2017, 22:52  [ТС]
Сама задача
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
09.10.2017, 23:23
Попробуйте соблюдать правила форума:
https://www.cyberforum.ru/announcement.php?a=3

Добавлено через 23 минуты
Что касается задачи -- проверка на простоту лишняя, просто делите число пока делится без остатка сперва на 2, потом на 3, потом прибавлять к делителю по 2 (но можете 2 и 4 попеременно).

Можете переписать в рекурсивном виде вот этот алгоритм:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  for i:=2 to 3 do
    if n mod i=0 then begin
      t:=0; repeat Inc(t); n:=n div i; until n mod i<>0;
      if Aster then Write(' * '); Aster:=True;
      if t>1 then Write(i,'^',t) else Write(i);
    end;
  i:=5; d:=2;
  while i<=n do begin
    if n mod i=0 then begin
      t:=0; repeat Inc(t); n:=n div i; until n mod i<>0;
      if Aster then Write(' * '); Aster:=True;
      if t>1 then Write(i,'^',t) else Write(i);
    end;
    Inc(i,d); d:=d xor 6;
  end;
0
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 19
09.10.2017, 23:43  [ТС]
я ничего не понял из того, что вы написали
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
09.10.2017, 23:46
У вас все впереди, не отчаивайтесь.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
10.10.2017, 07:49
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var mul : String := '';
 
procedure Simpl(n, d : Integer);
begin
  d += 1;
  while n mod d = 0 do
    begin
      Write(mul, d);
      (n, mul) := (n div d, '*');
    end;
  if n > 1 then Simpl(n, d);
end;
 
begin
  var n:=ReadLnInteger('Введите число');
  Write(n, '='); Simpl(n, 1);
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
10.10.2017, 08:02
JuriiMW,
практически даром сокращаем глубину рекурсии вдвое:
Pascal
5
  if d=2 then d+=1 else d+=2;
И делаем пометку, использован синтаксис PascalABC.NET.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
10.10.2017, 08:04
Цитата Сообщение от bormant Посмотреть сообщение
И делаем пометку, использован синтаксис PascalABC.NET.
Дык, это не мне, а ТС!
Ибо, у него в программе…
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
10.10.2017, 08:08
Так ведь ТС -- не единственный читатель темы. Да и кортежное присваивание, если правильно путаю, не так давно пришло в тот дивный язык.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
10.10.2017, 08:17
Кортежи анонсированы http://forum.mmcs.sfedu.ru/t/v... et-3-1/862

Добавлено через 22 секунды
Скоро уж 2 года!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
10.10.2017, 13:03

Не по теме:

Как быстро растут чужие дети... (q)



Добавлено через 2 часа 13 минут
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 GetMult(n: Longint);
var Aster: Boolean; c: Longint; d: Integer;
  procedure Impl;
  begin
    while n mod c=0 do begin
      if Aster then Write('*'); Aster:=True;
      Write(c); n:=n div c;
    end;
    case c of
      2: Inc(c);
      3: Inc(c,2);
      else begin
        Inc(c,d); d:=d xor 6;
      end;
    end;
    if c<=n then Impl;
  end;
begin
  Aster:=False; c:=2; d:=2; Impl;
end;
var n: Longint;
begin
  Write('N: '); Read(n); GetMult(n);
end.
Но стек все-равно не резиновый...

Добавлено через 12 минут
Или даже так :-)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure GetMult(n: Longint);
var Aster: Boolean; c: Longint; d: Integer;
  procedure Divide;
  begin
    while n mod c=0 do begin
      if Aster then Write('*'); Aster:=True;
      Write(c); n:=n div c;
    end;
  end;
  procedure Impl;
  begin
    Divide; Inc(c,d); d:=d xor 6;
    if c<=n then Impl;
  end;
begin
  Aster:=False; c:=2; d:=2;
  Divide; Inc(c); Divide; Inc(c,2); Impl;
end;
var n: Longint;
begin
  Write('N: '); Read(n); GetMult(n);
end.
Добавлено через 17 минут
Но полезнее все-таки не делать лишних вызовов :-)
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 GetMult(n: Longint);
var Aster: Boolean; c: Longint; d: Integer;
  procedure Divide;
  begin
    while n mod c=0 do begin
      if Aster then Write('*'); Aster:=True;
      Write(c); n:=n div c;
    end;
  end;
  procedure Impl;
  begin
    Divide;
    repeat Inc(c,d); d:=d xor 6;
    until (c>=n) or (n mod c=0);
    if c<=n then Impl;
  end;
begin
  Aster:=False; c:=2; d:=2;
  Divide; Inc(c); Divide; Inc(c,2); Impl;
end;
var n: Longint;
begin
  Write('N: '); Read(n); GetMult(n);
end.
0
0 / 0 / 0
Регистрация: 26.08.2016
Сообщений: 19
10.10.2017, 19:19  [ТС]
Цитата Сообщение от JuriiMW Посмотреть сообщение
(n, mul) := (n div d, '*');
Вы не могли бы объяснить вот эту строчку?
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
11.10.2017, 07:10
Это то же самое, что и
Code
1
n:=n div d; mul:='*';
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2017, 07:10
Помогаю со студенческими работами здесь

Объясните пожалуйста. Нюансы программы с рекурсией
Добрый день. Просьба, объясните пару нюансов программы. всё работает, но не могу разобраться для чего нам нужны вот эти строки, и что они...

неверная работа хоста
Такая ситуация: Есть сайт. есть директория /error/404.html. В htaccess прописано: мол при переходе на несуществующую страницу...

Неверная работа компаратора
Моделирую работу компаратора LM119, он переключается, однако почему между -15 и нулем, а не +15 и нулем? Заранее спасибо за помощь ...

Неверная работа sscanf
void mul(long long a, int y, int p, char *input) { memset(a, 0, sizeof(int)*11112); char temp; int i = strlen(input), j = 0, k; ...

Неверная работа JS в WebBrowser
И так. Я столкнулся с косяками веббраузера. Для начала: IE работает корректно, а веб браузер .NET нет. Ссылку на веб браузерную...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru