2017-01-19 9 views
2

配列に2つ以上の値がある場合、GCDを見つける方法は?最大公約数パスカル(2つ以上の値)

私は最小の値を見つけようと考えていました。そして、それによって配列からすべての要素を分けてみてください。そして、modが0でなければ、その値から1を取り除き、再び始めてください。

しかし、私はそれが間違った方法、任意のアイデアだから0を得る?

program GreatestCommonDivisor; 
type mas = array[1..100] of integer; 
var n : integer; 
M : mas; 
Rf : text; 

procedure Skaityti; 
var i : integer; 
Df : text; 
begin 
Assign(Df,'duom1.txt'); 
Reset(Df); 
Readln(Df,n); 

for i := 1 to n do 
    Read(Df,M[i]); 
Close(Df); 
end; 
function GCD(M : array of integer): integer; 
    var i,min : integer; 
    begin 
    min := M[1]; 
    for i := 1 to n do 
    begin 
     if min > M[i] then 
      min := M[i]; 
    end; 
     i := 1; 
    repeat 
     if M[i] mod min = 0 then 
      GCD := min 
     else 
     begin 
      min := min - 1 ; 
      i := 0; 
      continue; 
     end; 
     i := i + 1; 
    until i = n; 
    end; 
var min,i : integer; 
begin 
    Skaityti; 
Assign(Rf,'rez.txt'); 
for i := 1 to n do 
Writeln(Rf,GCD(M),' ',min); 

Close(Rf); 

end. 
+0

はあなたのコードを表示するあなたは最大公約数として、少なくとも1を取得しない場合は、何かウォンはobvouslyあります。 –

+0

質問に編集しました – Vilmis

+0

「M」はどこから来たの? – Lagerbaer

答えて

1

わからない、あなたの入力は何ですが、ここで私はあなたの推論に欠陥があると思うところです:

まず、あなたがあなたの潜在的なGCDとして最小の要素を検索してみてください。合理的な前提として、gcdはこれよりも大きくすることはできません。しかし、あなたのリストをループし、仮定されたgcdが均等に分割しない場合は、それを1つ減らして続行します。これは動作しません。

Start = 10, 9, 8; min = 8; gcd is undefined (defaults to 0) 
10 mod 8 is not 0, so min = 7 
9 mod 7 is not 0, so min = 6 
8 mode 6 is not 0, so min = 5 
Done, gcd is now 0 

Start = 10, 9, 8, 5, min = 5, gcd is undefined (defaults to 0) 
10 mod 5 is 0, so gcd = 5 
9 mod 5 is not 0, so min = 4 
8 mod 4 is 0, so gcd = 4 
5 mod 4 is not 0 so min = 3 
Done, gcd is now 4 

ここでは(非効率的)GCDを計算していたプログラムがある

Program ShowGCD(output); 
type 
    arr = array of integer; 
var 
    M: arr; 

function GCD(M: arr): integer; 
    var i,min : integer; 
begin 
    min := M[0]; 
    for i := 1 to Length(M)-1 do begin 
     if min > M[i] then 
      min := M[i]; 
     end; 
    i := 1; 
    repeat 
     if M[i] mod min = 0 then 
      GCD := min 
     else 
      begin 
       min := min - 1; 
       i := 0; 
       continue; 
      end; 
     i := i + 1; 
    until i = Length(M); 
end; 

begin 
    M:=arr.Create(15, 45, 25); 
    writeln('GCD: ', GCD(M)); 
end. 
+0

私は200分の1除算を得ました。 "min = 0ならブレーク;繰り返しループの始めに答えは0になるでしょう:/ – Vilmis

+0

ゼロで除算するためにどの入力を使用しますか? ? –

+0

ファイルからの入力を使用しています。最初の行は配列の長さ(4)で、2行目は6,20,14,16の入力です。 – Vilmis

関連する問題