题
我需要编写一个C程序才能找到完美的数字。
main()
{
int n=1000,sum = 0;
for(int num = 1; num <= n; num++)
{
sum = 0;
for(int i = 1; i < num; i++)
{
if(!(num%i))
{
sum+=i;
}
}
if(sum == num)
printf("\n%d",num);
}
}
if(!(num%i))
- 这是我不明白的D线。
如果还有其他简单的方法,请建议我
解决方案
if(!(num%i))
只是意味着 if( (num%i) == 0 )
其他提示
如果您正在寻找一种更有效的方法来查找完美的数字,则可能需要阅读 Wikipedia页面上的完美数字. 。在其中,您会发现没有已知的奇数数字(并且使用您的方法您不会找到任何),甚至所有完美的数字都是形式:
2^(p - 1)*(2^p - 1)
在哪里 2^p - 1
是素数,因此 p
是素数。因此,如果您想找到完美的数字,请检查 2^p - 1
对于所有素数 p
, , 如果是这样 2^(p - 1)*(2^p - 1)
是完美的。
如果您只想使用一个简单的循环找到几个小的完美数字,则可以通过注意到如果 i
分裂 num
, ,也是如此 num / i
. 。也就是说,您只需要循环直到 num
并添加对 i
和 num / i
至 sum
. 。请注意,如果 num
是正方形的,是平方根 num
必须只添加一次。
请注意,如果计算 sum
这样,它的价值将是 2 * num
对于完美的数字,不是 num
.
num % i
意思是“ num Modulo 我“;它返回了数字划分的提醒(因此, 0
和 i-1
).
在C中,0是错误的,所有其他数字都是正确的,所以 !(num % i)
测试“ num modulo i”是否为零,或者在普通的数学演讲中进行测试,如果i均等i,则i。
以非常简单的方式, if(!(num%i))
代码检查如果num的值除以i的值,并且剩余的0是否为0 ...因此,在此使用模量运算符%来查找其余部分。.此代码类似于 if(num % i==0)
。如果返回true,则应添加i的值。最后,如果总和值等于NUM的值,则数字是完美的,并且显示数字!