相对优质检查?

时间:2013-09-28 03:53:42

标签: c math greatest-common-divisor

好的,所以相对素数意味着两个数字没有大于1的公因子。它也可以被视为两个gcd = 1的数字。

所以沿着这些方向,这是我写的代码,找到两个相对素数e,z:

for(e = 0,flag=0; (flag==1); e++){ 
    if( gcd( e, z ) == 1){   // z in this example is 60
        flag = 1;
    } 
}

printf("e = %d\n",e);

并且gcd函数定义为:

int gcd(int i, int x){
   if(x % i == 0) return( i );
   return( gcd( x % i, x ) );
}

当我设置z = 60时,我得到的是e= 0 ...实际上我一直在使用相同的 e 来初始化for循环

我做错了什么?有没有其他方法可以找到两个数字是否相对素数?

修改

好的,根据minitech的建议,这里是修改后的代码:

for(e = 2,flag=0; !flag; e++){
    if( gcd( e, z ) == 1){
        flag = 1;
    } 
}

现在当我设置我的z = 60时,我的e出现了e = 60,这又是错误的。正确的答案应该是e = 7

2 个答案:

答案 0 :(得分:1)

  • 你不应该从零开始
  • 您的flag条件应为!flag

修好之后,你总会得到1,因为它对一切都是相对重要的。尝试从z - 1开始,如果你想要最大的那个,则递减。你也应该break;而不是保持旗帜。

答案 1 :(得分:1)

这有点脆弱,因为它无法处理零参数;如,

gcd(z, z) = gcd(z, 0) = gcd(0, z) = |z|.

我会选择类似的东西:

unsigned gcd (unsigned u, unsigned v)
{
    unsigned t;
    for (; (t = v) != 0; u = t)
        v = u % v;
    return u;
}

我使用无符号类型,因为没有理由使用否定参数 - 它们不会影响gcd的结果,而gcd总是非负的。