0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 29
1

Быстрый алгоритм нахождения суммы делителей натурального числа

02.04.2016, 21:04. Показов 2987. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, тема является идейным продолжением реализации этого алгоритма на С++ (Быстрое нахождение количества делителей натурального числа).

Не по теме:

А точнее, наглым образом переписанный на Паскаль алгоритм из этой темы


Однако, по какой-то причине данный алгоритм выводит неправильные данные (к примеру, для числа 12 программа даёт в ответе 22, хотя правильно 28).
Есть ли идеи, что тут было скоммунизжено не так? Поскольку на С++ алгоритм вроде работает верно.

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
var
  sum : Int64;
  i, x, k : integer;
 
begin
  read(x);
  if x = 1 then 
  begin
    write(1);
    Halt;
  end;
  sum:= 1;
  k:= 1;
  while (x and 1) = 0 do 
  begin
    k:= k shl 1;
    x:= x shr 1;
  end;
  k:= (k shl 1) - 1;
  if x = 1 then 
  begin
    write(k);
    Halt;
  end 
  else sum:= k;
  i:= 3;
  while (i*i) <= x do 
  begin
    k:= 1;
    while x mod i = 0 do 
    begin
      k:= k * i;
      x:= x div i;
    end;
    if k > 1 then sum:= sum * ((k*i - 1) div (i - 1));
    i:= i + 2;
  end;
  if x > 1 then sum:= sum * x + 1;
  write(sum);
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2016, 21:04
Ответы с готовыми решениями:

составьте функцию для нахождения суммы делителей данного числа
составьте функцию для нахождения суммы делителей данного числа

Составить программу нахождения для заданного натурального числа всех делителей, кратных числу
1. Дан одномерный массив, состоящий из вещественных элементов. Найти сумму элементов массива,...

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

Упростить код нахождения количества и суммы делителей заданного числа
как можно упростить етот код до уровня школьника? var n,k,s,i:word; begin read(n); k:=0;s:=0;...

4
Эксперт Pascal/Delphi
2386 / 1298 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
03.04.2016, 04:27 2
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
var
 sum:uint64=1;
 k:uint64=1;
 i,p,a:uint64;
begin
  readln(a);
  if a=1 then begin writeln(a); exit;end;
   while a and 1 = 0 do begin
      k:=k shl 1;
      a:=a shr 1;
    end;
   k := k shl 1 - 1;
   if a = 1 then begin writeln(k);exit;end
   else  sum:=k;
   i:=3;
   repeat
      p:=1; k:=1;
      while a mod i = 0 do begin
         k *= i;
         p += k;
         a:=a div i;
      end;
      if k > 1 then sum *= p;
   if a > 1 then sum *= a + 1;
   i:=i+2;
   until i*i>a; 
   writeln(sum);
end.
Добавлено через 2 минуты
Phoenix97, я брал последний код из указанной темы. Прошу прощения, что на PABC.NET, FPC на планшете нет
0
44 / 44 / 66
Регистрация: 22.07.2015
Сообщений: 191
03.04.2016, 10:00 3
Лучший ответ Сообщение было отмечено Phoenix97 как решение

Решение

38 строка:
Pascal
1
if x > 1 then sum:= sum * (x + 1);
1
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 29
03.04.2016, 12:52  [ТС] 4
Цитата Сообщение от a1d4r Посмотреть сообщение
if x > 1 then sum:= sum * (x + 1);
И точно Не заметил этот косяк. Теперь работает отлично, спасибо!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
03.04.2016, 22:11 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ежели что, переписал бы так:
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
{$mode ObjFPC}
function SumDvsr(a: Int64): Int64;
var i: Longint;
begin
  Result:=1; if a=1 then Exit;
  while a and 1=0 do begin
    Result:=Result shl 1; a:=a shr 1;
  end;
  Result:=Result shl 1-1;
  if a=1 then Exit;
  i:=3;
  while sqr(i)<=a do begin
    Result:=1;
    while a mod i=0 do begin
      Result:=Result*i; a:=a div i;
    end;
    if Result>1 then Result:=(Result*i-1) div (i-1);
    Inc(i,2);
  end;
  if a>1 then Result:=Result*(a+1);
end;
begin
  WriteLn(SumDvsr(12));
end.
Добавлено через 10 минут
А это второй:
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
{$mode ObjFPC}
function SumDvsr(a: Int64): Int64;
var i, p: Longint;
begin
  Result:=1; if a=1 then Exit;
  while a and 1=0 do begin
    Result:=Result shl 1; a:=a shr 1;
  end;
  Result:=Result shl 1-1;
  if a=1 then Exit;
  i:=3;
  while sqr(i)<=a do begin
    Result:=1; p:=1;
    while a mod i=0 do begin
      p:=p*i; Inc(Result,p); a:=a div i;
    end;
    if p>1 then Result:=Result*p;
    Inc(i,2);
  end;
  if a>1 then Result:=Result*(a+1);
end;
begin
  WriteLn(SumDvsr(12));
end.
0
03.04.2016, 22:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2016, 22:11
Помогаю со студенческими работами здесь

Рекурсивная функция нахождения суммы цифр натурального числа
Написать рекурсивную функцию нахождения суммы цифр любого натурального числа.

Составить алгоритм и программу нахождения суммы значений натурального ряда чисел, которые кратны 5 и не больше 200
Составить алгоритм и программу нахождения суммы значений натурального ряда чисел, которые кратны 5...

Функция для нахождения суммы цифр произвольного натурального числа
29. Вводятся 3 натуральных числа. Найти сумму цифр каждого из них (создать функцию для нахождения ...

Разработать алгоритм нахождения суммы и количества четных чисел натурального ряда, которые меньше К.Значение К вводится с клавиатуры.
Понимаю, что легкая программа на Паскале, но сделать не могу!Помогите пожалуйста Разработать...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru