好的,所以相对素数意味着两个数字没有大于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
答案 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总是非负的。