我需要 ADA 中的递归扩展 Gcd。我在 C 和 Ada 中有两个类似的函数,但只有 C 可以工作。怎么解决?
C:
int extended_gcd(int a, int b, int* x, int* y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int x1, y1;
int g = extended_gcd(b, a % b, &x1, &y1);
*x = y1;
*y = x1 - y1 * (a / b);
return g; }
艾达:
function extended_gcd(A,B: Integer; X,Y: out Integer) return Integer is
G :Integer;
X1,Y1 :Integer;
begin
if B = 0 then
X := 1;
Y := 0;
return A;
end if;
G := extended_gcd(B,A mod B,X1,Y1);
X := Y1;
Y := X1 - Y1 * (A/B);
return G;
end extended_gcd;
输入a = -56,b= 15
C 输出:1,x = 4,y = 15
ADA 输出:1 x = 4,y = 11
C
%
运算符是 余数 运算符,不是模。等效的 Ada 运算符是 rem
,而不是 mod
。尝试使用 rem
而不是 mod
,那么您应该会得到相同的结果。