微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

相对素数的递归算法

如何解决相对素数的递归算法

我正在创建一个函数来检查 2 个整数是否为互质/互质。如果它们是互质的,则函数返回 1,如果它们不是互质的,则返回 0。

函数应该能够接受任何顺序的任何整数,假设 a 和 b 都不为 0;

据我所知,gcd 为 -1 与 gcd 为 1 相同。这是正确的吗?

这是我的代码

int relatively_prime(int a,int b){

    if (a == 0 || b == 0) return 0;
    if (a%b == 0 && (b != 1 || b != -1)) return 0;
    else if (a%b== 0 && (b == 1 || b == -1)) return 1;
    else return relatively_prime(b,a % b);
}

这是正确的吗?有什么方法可以简化或改进我的代码

谢谢!

解决方法

int gcd(int a,int b)
{
    a=abs(a);
    b=abs(b);
    if (b == 0)

        return a;

    return gcd(b,a % b); 

 
}

现在如果结果是 1 他们是 coprime 。您可以将负数转换为正数以查看它们是否互质并简化代码。从技术上讲,我们可以将 0 写为 0* 任何数字,因此 0 不会与 1 以外的任何数字互质。

,

这是正确的吗?

没有

b != 1 || b != -1 始终为真。所以代码就像

int relatively_prime(int a,int b){
  if (a == 0 || b == 0) return 0;
  if (a%b == 0 /* && (b != 1 || b != -1) */) return 0;
  // a%b== 0 is never true below after the above line
  // else if (a%b== 0 && (b == 1 || b == -1)) return 1;
  else return relatively_prime(b,a % b);
}

...并且不返回 1。

OP 的代码因未定义行为 (UB) 而失败,至少在 relatively_prime(INT_MIN,-1) 尝试 INT_MIN % -1 的情况下。


有什么办法可以简化吗?

// Do not call with gcd_recursive(INT_MIN,-1)
static int gcd_recursive(int a,int b) {
  if (b == 0) return a;
  return gcd_recursive(b,a % b);
}

int relatively_prime_alt(int a,int b) {
  if (b == -1) b = 1; // Avoid a INT_MIN % -1 in gcd_recursive()
  int gcd = gcd_recursive(a,b);
  return gcd == 1 || gcd == -1;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。