这是我用C写的代码,用于查找给定的数字是否是完全数。
完全数是它所有因数的和。
示例- 6
6有因数2,3和1(1是因为它能被自己整除)2 + 3 + 1 = 6
#include <stdio.h>
int main(){
int number;
int sum =0,i;
scanf("%d",&number);
for(i=0;i<number;i++){
if(number % i==0){
sum += i;
}else{ sum = sum;}
}if(sum==number){
printf("Perfect Number");
}else{
printf("Not a Perfect Number");
}
return 0;
}
代码在逻辑上是正确的,它应该给出正确的输出,但问题是它没有给出任何输出。
在lion中,它以代码"进程结束,退出代码-1073741676 (0xC0000094)">
您的循环必须有i
从1
开始,而不是0
,否则当您执行number % i == 0
时将被除零:
#include <stdio.h>
int main(void) {
int number;
int sum = 0;
printf("Insert number: ");
scanf("%d", &number);
// NOTE: replaced condition `i < number` with `i <= number / 2`
// for improved performance
for (int i = 1; i <= number / 2; i++) {
if (number % i == 0) {
sum += i;
}
}
if (sum == number) {
printf("Perfect Numbern");
}
else {
printf("Not a Perfect Numbern");
}
return 0;
}
这里是一个圈复杂度为2的解。我看不出有什么理由,但是你可以这样做。
#include <stdio.h>
int main(void)
{
int number = 33550336;
int sum = 0;
for(int i = 1; i <= number / 2; i++) {
sum += i * (number % i == 0);
}
printf("%d is %s", number, "not a perfect number." + 4 * (sum==number));
return 0;
}
函数版本:
#include <stdio.h>
#include <stdbool.h>
bool is_perfect(int number)
{
int sum = 0;
for(int i = 1; i <= number / 2; i++) {
sum += i * (number % i == 0);
}
return sum == number;
}
int main(void)
{
int n = 33550336;
printf("%d is %s", n, "not a perfect number." + 4 * is_perfect(n));
return 0;
}
最好的版本是这个圈复杂度为1:
bool is_perfect(int n)
{
return n == 6 || n == 28 || n == 496 || n == 8128 || n == 33550336;
}
快得多!😅