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

Для интервала [33333;55555] найдите числа, которые кратны сумме своих простых собственных делителей

20.01.2022, 14:51. Показов 4157. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для интервала [33333;55555] найдите числа, которые кратны сумме своих простых собственных
делителей (меньших самого числа). В качестве ответа приведите в порядке возрастания числа, для
которых сумма простых делителей больше 250, после каждого числа запишите сумму его простых
собственных делителей.
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
   
var
  i,d,s:integer;
  
  function isPrime(x:integer):boolean;
  var 
    d:integer;
    b:boolean;
    begin
      b:=true;
      for d:=2 to round(sqrt(x)) do begin
        if x mod d=0 then begin
          b:=false;
          break
        end;
      end;
      result:=b;
      end;
      
      begin
       for i:=33333 to 55555 do begin
         s:=0;
         for d:=2 to round(sqrt(i)) do begin
           if isPrime(d) and (i mod d=0) then begin
             s:=s+d;
             if isPrime(i div d) and (i mod(i div d)=0) then s:=s+(i div d);
           end;
           if (i mod s=0) and (s>250) then writeln(i,' ',s)
         end;
         end;
    end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.01.2022, 14:51
Ответы с готовыми решениями:

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

Найти все числа, меньше заданного числа, которые равны сумме своих делителей, исключая себя
Помогите пожалуста, это сложное задание, я в этом паскале мало что знаю Мне нужно написать вот эту прогу: "Найти все натуральные...

Найдите все числа из интервала (100,150), которые кратны своему цифровому корню
3.Найдите все числа из интервала (100,150), которые кратны своему цифровому корню. Вывести число и его численный корень.

17
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
20.01.2022, 18:07
Для полных квадратов в сумму посчитается лишний делитель SqRt(n2).

Добавлено через 27 минут
Если вопрос был про быстро действие, то лучше построить список простых до Trunc(SqRt(55555)) каким-нибудь решетом, затем использовать их в качестве делителя.

Текущую реализацию можно немножко ускорить, если сперва проверять делимость, а затем простоту (поменять порядок mod и IsPrime).
Можно на форуме найти более экономную IsPrime, но существенным образом на скорость это не повлияет.
0
Модератор
10445 / 5737 / 3406
Регистрация: 17.08.2012
Сообщений: 17,450
21.01.2022, 04:33
До Trunc(SqRt(55555)) всего 51 простое число.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const
  p: array[1..52] of integer = (
      2,   3,   5,   7,  11,  13,  17,  19,  23,  29,  31,  37,  41,
     43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97, 101,
    103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
    173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239);
var
  i, n, sum, sqrt_n: integer;
begin
  for n := 33333 to 55555 do
    begin
      i := 1;
      sum := 0;
      sqrt_n := trunc(sqrt(n));
      while p[i] <= sqrt_n do
        begin
          if n mod p[i] = 0 then inc(sum, p[i]);
          inc(i)
        end;
      if sum > 250 then writeln(n, ' ', sum)
    end
end.
Добавлено через 1 час 36 минут
С решетом Эратосфена:
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
var
  n, sum, sqrt_n, i, k: integer;
  d: array[1..250] of integer;
  p: array[1..60] of integer;
begin
  for n := 2 to 250 do d[n] := n;
  k := 0;
  for n := 2 to 250 do
    if d[n] > 0 then
      begin
        inc(k);
        p[k] := d[n];
        i := n * n;
        while i <= 250 do
          begin
            d[i] := 0;
            inc(i, n)
          end
      end;
  for n := 33333 to 55555 do
    begin
      i := 1;
      sum := 0;
      sqrt_n := trunc(sqrt(n));
      while p[i] <= sqrt_n do
        begin
          if n mod p[i] = 0 then inc(sum, p[i]);
          inc(i)
        end;
      if sum > 250 then writeln(n, ' ', sum)
    end
end.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
21.01.2022, 09:52
Цитата Сообщение от PasZlata Посмотреть сообщение
сумме своих простых собственных
делителей (меньших самого числа)
извините, что-то я никак не могу понять..
подскажите, а чему равна сумма своих простых собственных делителей (меньших самого числа) для
числа 8 ?
для числа 72 ?
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
21.01.2022, 10:50
По определению: Делитель числа, отличный от этого числа, называется собственным делителем числа.
Своих, вероятно, было добавлено, чтобы наверняка обнуляли счётчик.
И как результат:
8 —> 2
72 —> 6
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
21.01.2022, 13:50
Cyborg Drone,
пожалуй, из суммы потерялись простые парные делители...
0
Модератор
10445 / 5737 / 3406
Регистрация: 17.08.2012
Сообщений: 17,450
21.01.2022, 21:09
bormant, точно. Видно, у меня к четырём часам утра батарейки сели.

Решето придётся побольше сделать, до 55555 div 2. Заодно его можно использовать для определения простоты парного делителя. На всякий случай, сделаю вид, что не знаю, что до sqrt(55555) имеется 51 простое число.

С решетом Эратосфена:
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
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 1;
  pmax = trunc(sqrt(n2));
var
  n, i, pm, sum, sqrt_n, np: integer;
  e: array[2..emax] of integer;
  p: array[1..pmax] of integer;
begin
  for n := 2 to emax do e[n] := n;
  for n := 2 to emax do
    if e[n] > 0 then
      begin
        i := n * n;
        while i <= emax do
          begin
            e[i] := 0;
            inc(i, n)
          end
      end;
  pm := 0;
  for i := 2 to pmax do
    if e[i] > 0 then
      begin
        inc(pm);
        p[pm] := e[i]
      end;
  p[pm+1] := pmax; //барьер
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if sqr(sqrt_n) < n then sum := 0 else sum := -e[sqrt_n];
      i := 1;
      while p[i] < sqrt_n do
        begin
          if n mod p[i] = 0 then
            begin
              np := n div p[i];
              inc(sum, p[i] + e[np]);
            end;
          inc(i)
        end;
      if sum > nd then writeln(n, ' ', sum);
    end
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 2;
  pmax = trunc(sqrt(n2));
var
  n, i, j, pm, sum, sqrt_n, np: integer;
  e: array[1..emax+1] of integer;
  p: array[1..pmax] of integer;
begin
  n := 1;
  for i := 1 to emax + 1 do
    begin
      inc(n, 2);
      e[i] := n
    end;
  for i := 1 to trunc((sqrt(emax shl 1 or 1) - 1) / 2) do
    for j := i to trunc((emax - i) / (i shl 1 or 1)) do
      e[i * j shl 1 + i + j] := 0;
  pm := 1;
  p[pm] := 2;
  i := 1;
  for i := 1 to pmax shr 1 or 1 do
    if e[i] > 0 then
      begin
        inc(pm);
        p[pm] := e[i]
      end;
  p[pm+1] := pmax; //барьер
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if sqr(sqrt_n) < n then sum := 0 else sum := -e[sqrt_n];
      i := 1;
      while p[i] < sqrt_n do
        begin
          if n mod p[i] = 0 then
            begin
              inc(sum, p[i]);
              np := n div p[i];
              if odd(np) then inc(sum, e[np shr 1])
            end;
          inc(i)
        end;
      if sum > nd then writeln(n, ' ', sum);
    end
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
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
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 1;
  pmax = trunc(sqrt(n2));
var
  n, i, j, k, pm, sum, sqrt_n, np: integer;
  e: array[1..emax+1] of integer;
  p: array[1..pmax] of integer;
begin
  sqrt_n := trunc(sqrt(emax));
  for i := 1 to sqrt_n do
    for j := 1 to sqrt_n do
      begin
        n := 4 * i * i + j * j;
        if (n <= emax) and ((n mod 12 = 1) or (n mod 12 = 5)) then e[n] := e[n] xor n;
        dec(n, i * i);
        if (n <= emax) and (n mod 12 = 7) then e[n] := e[n] xor n;
        dec(n, j * j shl 1);
        if (i > j) and (n <= emax) and (n mod 12 = 11) then e[n] := e[n] xor n
      end;
  for i := 5 to sqrt_n do
    if e[i] > 0 then
      begin
        k := i * i;
        n := k;
        while n <= emax do
          begin
            e[n] := 0;
            inc(n, k)
          end
      end;
  e[2] := 2;
  e[3] := 3;
  pm := 0;
  for i := 2 to pmax do
    if e[i] > 0 then
      begin
        inc(pm);
        p[pm] := e[i]
      end;
  p[pm+1] := pmax; //барьер
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if sqr(sqrt_n) < n then sum := 0 else sum := -e[sqrt_n];
      i := 1;
      while p[i] < sqrt_n do
        begin
          if n mod p[i] = 0 then
            begin
              np := n div p[i];
              inc(sum, p[i] + e[np]);
            end;
          inc(i)
        end;
      if sum > nd then writeln(n, ' ', sum);
    end
end.
0
Модератор
10445 / 5737 / 3406
Регистрация: 17.08.2012
Сообщений: 17,450
23.01.2022, 20:53
Хорошие программы я написал, жаль, что НЕ ВЕРНЫЕ. Учтены не все простые делители от корня квадратного из числа до числа, делённого на 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
29
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 1;
var
  n, i, sum, sqrt_n: integer;
  e: array[2..emax] of integer;
begin
  for n := 2 to emax do e[n] := n;
  for n := 2 to emax do
    if e[n] > 0 then
      begin
        i := n * n;
        while i <= emax do
          begin
            e[i] := 0;
            inc(i, n)
          end
      end;
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if sqr(sqrt_n) < n then sum := 0 else sum := -e[sqrt_n];
      for i := 2 to sqrt_n do
        if n mod i = 0 then inc(sum, e[i] + e[n div i]);
      if sum > nd then writeln(n, ' ', sum);
    end
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
27
28
29
30
31
32
33
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 2;
var
  n, i, j, sum, sqrt_n, d: integer;
  s: array[1..emax+1] of integer;
begin
  n := 1;
  for i := 1 to emax + 1 do
    begin
      inc(n, 2);
      s[i] := n
    end;
  for i := 1 to trunc((sqrt(emax shl 1 or 1) - 1) / 2) do
    for j := i to trunc((emax - i) / (i shl 1 or 1)) do
      s[i * j shl 1 + i + j] := 0;
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if odd(sqrt_n) and (sqr(sqrt_n) = n) then sum := -s[sqrt_n shr 1] else sum := 0;
      if not odd(n) then inc(sum, 2);
      for i := 2 to sqrt_n do
        if n mod i = 0 then
          begin
            if odd(i) then inc(sum, s[i shr 1]);
            d := n div i;
            if odd(d) then inc(sum, s[d shr 1])
          end;
      if sum > nd then writeln(n, ' ', sum);
    end
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const
  n1 = 33333;
  n2 = 55555;
  nd = 250;
  emax = n2 shr 1;
var
  n, i, j, sum, sqrt_n: integer;
  a: array[1..emax+1] of integer;
begin
  sqrt_n := trunc(sqrt(emax));
  for i := 1 to sqrt_n do
    for j := 1 to sqrt_n do
      begin
        n := 4 * i * i + j * j;
        if (n <= emax) and ((n mod 12 = 1) or (n mod 12 = 5)) then a[n] := a[n] xor n;
        dec(n, i * i);
        if (n <= emax) and (n mod 12 = 7) then a[n] := a[n] xor n;
        dec(n, j * j shl 1);
        if (i > j) and (n <= emax) and (n mod 12 = 11) then a[n] := a[n] xor n
      end;
  for i := 5 to sqrt_n do
    if a[i] > 0 then
      begin
        j := i * i;
        n := j;
        while n <= emax do
          begin
            a[n] := 0;
            inc(n, j)
          end
      end;
  a[2] := 2;
  a[3] := 3;
  for n := n1 to n2 do
    begin
      sqrt_n := trunc(sqrt(n));
      if sqr(sqrt_n) < n then sum := 0 else sum := -a[sqrt_n];
      for i := 2 to sqrt_n do
        if n mod i = 0 then inc(sum, a[i] + a[n div i]);
      if sum > nd then writeln(n, ' ', sum);
    end
end.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
24.01.2022, 11:42
JuriiMW, спасибо за ответ.

но тут
Цитата Сообщение от JuriiMW Посмотреть сообщение
72 —> 6
сомневаюсь. Думаю, что имелось в виду 2+3=5

Cyborg Drone, а если не находить простые числа, а просто делить число, пока оно делится, так получается очень неэффективно?

я имею в виду код для нахождения суммы простых делителей:
Pascal
1
2
3
4
      sum := 0;
      for i := 2 to trunc(sqrt(n)) do
            if n mod i = 0 then begin sum := sum + i; while n mod i=0 do n := n div i; end;
      WriteLn('sum=',sum);
Добавлено через 8 минут
полностью код такой:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  k, i, n, sum : integer;
begin
  for k := 33333 to 55555 do
    begin
      sum := 0;
      n := k;
      for i := 2 to trunc(sqrt(n)) do
            if n mod i = 0 then begin sum := sum + i; while n mod i=0 do n := n div i; end;
      if (sum>250) and (k mod sum=0) then WriteLn(k,' ',sum)
    end
end.
Cyborg Drone, а Вы точно находите числа
Цитата Сообщение от PasZlata Посмотреть сообщение
которые кратны сумме своих простых собственных
делителей (меньших самого числа)
??
Мне кажется, что Вы проглядели это условие в задании.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
24.01.2022, 11:55
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
полностью код такой
Это так не работает Потеряете делители, что больше корня, пример в небольших числах для наглядности:
2*13=26, Trunc(SqRt(26))=5, делитель 13 потеряется, да?

Добавлено через 6 минут
Pascal
7
8
9
10
11
12
13
14
15
16
17
18
  n:=k;
  if not Odd(n) then begin
    Inc(sum,2); repeat n:=n div 2; until Odd(n);
  end;
  d:=3;
  while d<=n do begin
    if n mod d=0 then begin
      Inc(sum,d); repeat n:=n div d; until n mod d<>0;
    end;
    Inc(d,2);
  end;
  if d>k then Dec(sum,k);
1
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
24.01.2022, 12:03
Цитата Сообщение от bormant Посмотреть сообщение
Это так не работает Потеряете делители, что больше корня, пример в небольших числах для наглядности:
2*13=26, Trunc(SqRt(26))=5, делитель 13 потеряется, да?
да, точно, спасибо, это я лопухнулся...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
24.01.2022, 13:12
Cyborg Drone,
не пропадать же добру из #3, тем более что к SqRt(n) подтолкнул все-таки я

Углубим и расширим! Проверим симметричный множитель на простоту по имеющейся табличке простых...
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
const
  p: array[0..51] of Integer = (
      2,   3,   5,   7,  11,  13,  17,  19,  23,  29,  31,  37,  41,
     43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97, 101,
    103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
    173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239);
var
  i, j, n, t, s, nr, tr: Integer;
begin
  for n:=33333 to 55555 do begin
    s:=0; i:=0; nr:=Trunc(SqRt(n));
    while p[i]<=nr do begin
      if n mod p[i]=0 then begin
        Inc(s,p[i]); t:=n div p[i]; { симметричный делитель }
        if t>p[i] then begin { проверим на простоту }
          j:=0; tr:=Trunc(SqRt(t));
          while (p[j]<=tr) and (t mod p[j]<>0) do Inc(j);
          if p[j]>tr then Inc(s,t);
        end;
      end;
      Inc(i);
    end;
    if s>250 then WriteLn(n,' ',s);
  end;
end.
В таком виде идея провалилась.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
24.01.2022, 13:25
bormant, тот же вопрос. Вы точно уверены, что решаете задачу из пост #1 ?
Ну нет же проверки на делимость числа его сумме простых делителей!

Цитата Сообщение от bormant Посмотреть сообщение
Pascal
23
if s>250 then WriteLn(n,' ',s);
Pascal
23
if (s>250) and (n mod s=0) then WriteLn(n,' ',s);
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
24.01.2022, 14:25
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Ну нет же проверки на делимость числа его сумме простых делителей!
Это не единственная проблема На самом деле, как обычно, все гораздо хуже.
Недостаточно проверять парные делители только для простых первых делителей, есть парные простые для первых составных.
Поэтому, подход из #12 пока нужно списать в утиль.

Полное решето (накрывающее диапазон) этого недостатка лишено.

Добавлено через 21 минуту
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Ну нет же проверки на делимость числа его сумме простых делителей!
С другой стороны, может и хорошо, что про нее забыли в процессе обсуждения
Она скрывает от глаз слишком много ошибок с подсчетом суммы делителей...

Добавлено через 33 минуты
Cyborg Drone,
Попытка №2
не пропадать же добру из #3, тем более что к SqRt(n) подтолкнул все-таки я

Углубим и расширим!
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
const
  pn=52;
  p: array [0..pn-1] of Integer = (
      2,   3,   5,   7,  11,  13,  17,  19,  23,  29,  31,  37,  41,
     43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97, 101,
    103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
    173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239);
var
  i, j, k, n, t, s, nr, tr, lt, rt, md: Integer;
begin
  for n:=33333 to 55555 do begin
    nr:=Trunc(SqRt(n)); s:=0;
    for k:=2 to nr do begin
      if n mod k=0 then begin {есть делитель}
        lt:=0; rt:=pn-1;       {поищем среди простых}
        while lt<=rt do begin
          md:=lt+(rt-lt) div 2;
          if p[md]<k then lt:=md+1 else if p[md]>k then rt:=md-1 
          else begin
            Inc(s,k); Break;   {нашли}
          end;
        end;
        t:=n div k;            {симметричный делитель}
        if t>k then begin       {непарный}
          tr:=Trunc(SqRt(t)); j:=0; {проверим его на простоту делением}
          while (p[j]<=tr) and (t mod p[j]<>0) do Inc(j);
          if p[j]>tr then Inc(s,t);
        end;
      end;
    end;
    if (s>250) and (n mod s=0) then WriteLn(n,' ',s);
  end;
end.
Без добавки "and (n mod s=0)" выхлоп идентичен выхлопу кода №1 из сообщения №8.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
24.01.2022, 14:56
mr-Crocodile,
возвращаясь к "с другой стороны" из сообщения №14:
программа из №12 содержит неправильный алгоритм в том смысле, что он выдает усеченный набор чисел, сумма простых делителей которых больше 250, но этот неполный набор содержит те самые 3 числа, которые кратны сумме своих простых собственных делителей.
Да-да, этот набор достаточен для правильного ответа на поставленный в задаче вопрос, достаточно той самой правки про кратность:
Pascal
23
    if (s>250) and (n mod s=0) then WriteLn(n,' ',s);
В сухом остатке: неправильная программа из №12 выдает правильный ответ
Пожалуй, как в той старой шутке -- содержит четное количество ошибок
1
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
24.01.2022, 15:21
Цитата Сообщение от bormant Посмотреть сообщение
В сухом остатке: неправильная программа из №12 выдает правильный ответ
а разве моя неправильная программа из пост #9 не выдаёт правильный ответ?
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  k, i, n, sum : integer;
begin
  for k := 33333 to 55555 do
    begin
      sum := 0;
      n := k;
      for i := 2 to trunc(sqrt(n)) do
            if n mod i = 0 then begin sum := sum + i; while n mod i=0 do n := n div i; end;
      if (sum>250) and (k mod sum=0) then WriteLn(k,' ',sum)
    end
end.

38086 278
44998 302
53332 268

впрочем, тут скорее нужно говорить не о чётном количестве ошибок - а о просто везении - числа, для которых неверно считается сумма простых делителей - не подходят в качестве решения!

Особенно забавно, если составители задания специально заложили такую "пасхалку" в задание
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
24.01.2022, 15:27
mr-Crocodile,
уравновешу правильной (но если кто найдет ошибки, ткните носом ) реализацией подхода с разложением на множители:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var n, k, d, s: Integer;
begin
  for k:=33333 to 55555 do begin
    n:=k; s:=0;
    if not Odd(n) then begin
      Inc(s,2); repeat n:=n div 2; until Odd(n);
    end;
    d:=3;
    while d<=n do begin
      if n mod d=0 then begin
        Inc(s,d); repeat n:=n div d; until n mod d<>0;
      end;
      Inc(d,2);
    end;
    if d>k then Dec(s,k);
    if (s>250) and (k mod s=0) then WriteLn(k,' ',s);
  end;
end.
1
Модератор
10445 / 5737 / 3406
Регистрация: 17.08.2012
Сообщений: 17,450
24.01.2022, 21:49
Поправка к решету Эратосфена из сообщения #8:
Pascal
11
  for n := 2 to trunc(sqrt(n2)) do
После корня квадратного из максимума уже нечего вычёркивать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2022, 21:49
Помогаю со студенческими работами здесь

Найдите все числа из интервала (100, 200), которые кратны своему цифровому корню
Помогите решить на VBA

Определить, какие числа в массиве совершенные(равные сумме своих делителей), указать их количество
Задание: Дан массив из N целых положительных чисел. Определить, какие числа в массиве совершенные (равные сумме своих делителей), указать...

Существуют натуральные числа равные сумме кубов своих цифр. Найдите такие числа в заданном интервале
Существуют натуральные числа равные сумме кубов своих цифр ,например 370 ,33+73+03=370. Найдите такие числа в интервале от «а» до «b».

Найдите трехзначные числа, равные сумме кубов своих цифр
Составить алгоритм и блок-схему для решения задачи: Найдите трехзначные числа, равные сумме кубов своих цифр.

Найдите трехзначные числа, равные сумме кубов своих цифр
Найдите трехзначные числа, равные сумме кубов своих цифр.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу 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