C 相对优质支票?
所以相对素数意味着两个数没有大于1的公因数。也可以将其视为gcd=1的两个数字 沿着这些思路,我写了一段代码来寻找两个相对质数e,z: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(
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
调用,它会被零除。