пятница, 18 октября 2013 г.

Программа нахождения следующего за данным совершенного числа

Программа нахождения следующего за данным совершенного числа. Совершенным называется число, сумма делителей которого, не считая самого числа равна этому числу. Первое совершенное число 6 (6=1+2+3).

 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
59
60
function is_perfect(n : longint) : boolean;
var
  s : longint;
  divider : Integer;
begin
  s := 1;
  for divider := 2 to trunc(sqrt(n)) do
    if n mod divider = 0 then s := s + divider + (n div divider);
  is_perfect := (n = s);
end;
 
function get_candidate(len : integer) : longint;
var
  s : string;
  i : integer;
  value : longint;
begin
  s := '';
  for i := 1 to len do s := '1' + s + '0';
  s := '1' + s;
 
  value := 0;
  for i := 1 to length(s) do
    value := 2 * value + (ord(s[i]) - ord('0'));
  get_candidate := value;
end;
 
function to_bin(n : longint) : string;
var
  s : string;
const
  digit: string[2]='01';
begin
  s := '';
  repeat
    s := digit[(n mod 2) + 1] + s;
    n := n div 2;
  until n = 0;
  to_bin := s;
end;
 
 
var
  found : boolean;
  bin : integer;
  bin_s : string;
  check : LongInt;
  n : longint;
begin
  { n := 496; }
  write('perfect number: '); readln(n);
  bin_s := to_bin(n);
  bin := (length(bin_s) - 1) div 2;
  repeat
    inc(bin);
    check := get_candidate(bin);
    found := is_perfect(check);
  until found;
  writeln('next perfect number = ', check);
end.

Источник

Комментариев нет:

Отправить комментарий