2

プログラムの問題は次のとおりです。

フレンドリー番号:

「フレンドリー ナンバー」と呼ばれる特定の数字のペアがあります。定義上、フレンドリ数は 2 つの異なる数であり、その固有約数の合計はもう一方の数に等しくなります。

例: 友好的な数字の最小のペアは 220 と 284 です。220 の適切な約数は、1、2、4、5、10、11、20、22、24、44、55、および 110 です。約数は 284 です。

一方、284 の適切な約数は、1、2、4、71、および 142 です。これらの約数の合計は 220 です。

したがって、220 と 284 は「フレンドリー ナンバー」と呼ばれます。フレンドリーな数字の最初の 2 ダースのペアを見つけて出力するプログラムを作成します。

友好的な番号のリストはここにあります。80620 と 389924 に到達しようとしています。

私のソースコードはここにあります:

program  Friendly Numbers;

type List=Array[1..50] of Integer;

var Num,Sum,Sum2,C,C2,C3,C4,CheckNum,LastNum:Integer;
    NumUsed:String;
    CheckedNum,CheckedSum:List;
    
begin
Num:=200;

while C3<=23 Do
  begin
          
    while C<Num Do
      begin  
        C:=C+1;
        if (C<>Num) and (Num mod C=0) then Sum:=Sum+C;
      end;
  
    while C2<Sum Do
      begin
        C2:=C2+1;
        if (C2<>Sum) and (Sum mod C2=0) then Sum2:=Sum2+C2;
      end;

    if Num=Sum2 then
      begin
      
        for C4:=1 to 35 do
          begin
            if CheckedNum[C4]=C2 then NumUsed:='T';
            if CheckedSum[C4]=Num then NumUsed:='T';
          end;
          
        if (C2<>LastNum) and (NumUsed<>'T') and (Num<>C2) then
          begin
            C3:=C3+1;
            Writeln(C3,')',Num:8,C2:8);
            LastNum:=Num;
          end;
          
      Checknum:=CheckNum+1;
      CheckedNum[CheckNum]:=Num;
      CheckedSum[CheckNum]:=C2;    
    end;
    
  NumUsed:='F';
  Num:=Num+1;
  Sum:=0;
  Sum2:=0;
  C:=0;
  C2:=0;
  end;

Readln;        
end.

出力:

1)     220     284
2)    1184    1210
3)    2620    2924
4)    5020    5564
5)    6232    6368
6)   10744   10856
7)   12285   14595
8)   17296   18416
9)   63020   76084
10)   66928   66992
11)   67095   71145
12)   69615   87633
13)   79750   88730
14)  100485  124155
15)  122265  139815
16)  122368  123152
17)  141664  153176
18)  142310  168730
19)  171856  176336
20)  176272  180848
21)  176336  171856

*176336 が前の行で繰り返されますが、176336 は 2 行前の右側の列に既に表示されています。

22)  180848  176272
23)  185368  203432
24)  196724  202444
4

2 に答える 2

3

配列に格納しているものと画面に表示しているものには違いがあります。すべてのペアを保存していますが、一意のもののみを表示しています (または、少なくとも表示しようとしています)。また、表示されたペアを保存されているものとは異なる方法で列挙しています。それに加えて、数値が既に検出されている (そして表示されているように見える) かどうかを確認するときに、配列の最初の 35 要素のみを検索しているという事実があります。

ここで、プログラムが検出したすべてのペアを表示することに決めた場合、つまり、配列に格納されているものとインデックスの下に何が格納されているかを確認すると、次のように表示されます。

1)     220     284
2)     284     220
3)     496     496
4)    1184    1210
5)    1210    1184
6)    2620    2924
7)    2924    2620
8)    5020    5564
9)    5564    5020
10)    6232    6368
11)    6368    6232
12)    8128    8128
13)   10744   10856
14)   10856   10744
15)   12285   14595
16)   14595   12285
17)   17296   18416
18)   18416   17296
19)   63020   76084
20)   66928   66992
21)   66992   66928
22)   67095   71145
23)   69615   87633
24)   71145   67095
25)   76084   63020
26)   79750   88730
27)   87633   69615
28)   88730   79750
29)  100485  124155
30)  122265  139815
31)  122368  123152
32)  123152  122368
33)  124155  100485
34)  139815  122265
35)  141664  153176
36)  142310  168730
37)  153176  141664
38)  168730  142310
39)  171856  176336  <<<
40)  176272  180848
41)  176336  171856
42)  180848  176272
43)  185368  203432
44)  196724  202444
...

176336 が最初に検出された時点に注意してください: ペア #39 で。これで、数値を 2 回目に表示するときにプログラムがそれを無視しているように見える理由がわかります。単純に、35 番目の要素を超えて配列を検索する必要がないからです。

一方、表示したものだけを保存する場合は、35 で十分かもしれません。

于 2013-01-09T13:56:15.063 に答える
1

最終的なリストの条件は次のとおりです。 If (C2<>LastNum) and (NumUsed<>'T') and (Num<>C2) Then

を使用
If (C2<>LastNum) and (NumUsed<>'T') and (Num<C2) Then
すると、最初に番号が小さいペアを1つだけ残す必要があります。

切り替えられたペアも20)と22)にあり、おそらくさらにフォローする必要があります。

ただし、正確性は確認していません。

于 2013-01-08T16:18:29.940 に答える