Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 最大公约数Pascal(超过2个值)_Arrays_Pascal_Greatest Common Divisor - Fatal编程技术网

Arrays 最大公约数Pascal(超过2个值)

Arrays 最大公约数Pascal(超过2个值),arrays,pascal,greatest-common-divisor,Arrays,Pascal,Greatest Common Divisor,如果数组中有2个以上的值,如何查找GCD 我想找到最小的值,试着将数组中的每个元素除以它,如果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;

如果数组中有2个以上的值,如何查找GCD

我想找到最小的值,试着将数组中的每个元素除以它,如果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.

不确定您的输入是什么,但我认为您的推理存在缺陷:

首先,你试着找到最小的元素作为你的潜在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的程序(效率低下)


显示你的代码,如果你没有得到至少1的gcd,那么很明显有问题。将它编辑到问题中,
M
来自何处?我得到一个错误200“除零”我试着输入“如果最小值=0,则断开;在重复循环的开始部分,答案将是0:/您使用什么输入来获得除0?我使用的是来自文件的输入,第一行是数组的长度(4),第二行是6,20,14,16的输入。您可能发送了错误的值。是否可以向该方法发送一个较大的数组,其中尾部元素中包含零?运行
M:=arr.Create(6,20,14,16)按预期给出
2
,而
M:=arr.Create(6,20,14,16,0)给出“零除”。要么我真的不理解你,要么你不理解我。您的意思是,可能我发送了一个错误的数组,其中包含0,但我已经告诉您我要发送的数组。或者你是说别的?
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.