Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
C 相对优质支票?_C_Math_Greatest Common Divisor - Fatal编程技术网

C 相对优质支票?

C 相对优质支票?,c,math,greatest-common-divisor,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(

所以相对素数意味着两个数没有大于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是
e=0
。。。实际上,我一直得到初始化for循环所用的e

我做错了什么?如果两个数字是相对素数,还有别的方法吗

编辑:

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

for(e = 2,flag=0; !flag; e++){
    if( gcd( e, z ) == 1){
        flag = 1;
    } 
}
现在,当我设置z=60时,我的e是e=60,这又错了。正确答案应为e=7
  • 你不应该从零开始
  • 您的
    标志
    条件应为
    !标志

  • 修正后,你总是会得到1,因为它对所有事物都是相对优先的。尝试从
    z-1开始,如果想要最大的,则递减。你也应该仅仅是
    break而不是保留一个标志。

    这有点脆弱,因为它不能处理零参数;e、 g

    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总是非负的。

    我根据您的建议修改了代码(请参见编辑)。。但现在我得到e=60。这又错了。正确的e应该是7@sukhvir:欧几里德的GCD算法看起来像
    intGCD(intA,intB){如果(!b)返回a;返回GCD(b,a%b);}
    。您的
    GCD
    函数不健壮,如果使用
    i=0
    调用,它会被零除。