输入一个整数
。
输出一个整数,代表区间内完全数的个数。
1000
3
第一个完全数是
,因为
的约数有
,去除本身后,剩余约数之和为
。
第二个完全数是
,因为
的约数有
,去除本身后,剩余约数之和为
。
#include <stdio.h> int main() { int i, j, l, n; int r, s = 0; scanf("%d", &n); for (i = 6; i <= n; i++)//示例:第一个完全数为6,之前的不考虑 { l = i; r = 0; for (j = 2; j < i; j++)//不算本体因子所以不除1 { if (l % j == 0) r += l / j; if (j == i - 1 && r + 1 == l)//全部因子(除自身与1外)全部加和后,加1查看结果 { s++; break; } } } printf("%d", s); }暴力解法,苦苦电脑,解放人脑
#include <stdio.h> #include <math.h> int is_perfect_num(int num) { int sum = 1; for (int i = 2; i <= sqrt(num); i++) { if (num % i == 0) {//判断是否能够整除i,能整除则i和结果都是约数 sum += i; //与除数相加 if (i != sqrt(num))//防止除数和结果相同的情况下重复相加 sum += num / i; //与相除结果相加 } } if (sum == num) return 1; return 0; } int main() { int n; while (~scanf("%d", &n)) { int count = 0; for (int i = 2; i <= n; i++) { //对n以内的数字都进行判断是否是完全数,注意1不参与判断 if (is_perfect_num(i)) count++; } printf("%d\n", count); } return 0; }完全数的判断的小优化:
约束条件:j * j < i #include <stdio.h> int main() { int a, sum, count = 0; scanf("%d", &a); for(int i = 2; i <= a; i++) { sum = 1; for(int j = 2; j * j < i; j++) { if(i % j == 0) { sum += j; sum += (i / j); } } if(sum == i) count++; } printf("%d\n", count); return 0; }
#include <stdio.h> #include <math.h> int wqs(int num){ //完全数判断函数,传入一个待判定的整型数 int i, mid; mid = num; for(i = 1 ; i < sqrt(num) ; i++){ if(num % i == 0){ num = num + i + num / i; } } if(num == ( 3 * mid )){ //待判断数本身 + 因数和(包括了 “ 1 * 本身 ” 这种情况) = 3 * 待判断数 return 1; }else{ return 0; } } int main() { int n, i, num = 0; scanf("%d",&n); for(i = 1 ; i <= n ; i++){ if(wqs(i)){ //对1~n之间的数遍历调用判断函数,若判断为完全数,则将计数值自增一 num ++ ; } } printf("%d",num + 1); return 0; }
int main() {
int n = 0; scanf("%d", &n); int cnt = 0; int sum = 0; while (n) { sum = 0; for (int i = 1; i n; i++) { if (n % i == 0) { sum += i; } if (sum == n && i == n - 1) { cnt++; break; } } n--; } printf("%d", cnt); return 0;
}
```
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int n = 0;
scanf("%d", &n);
int cnt = 0;
int sum = 0;
while (n) {
sum = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sum += i;
}
if (sum == n && i == n - 1) {
cnt++;
break;
}
}
n--;
}
printf("%d", cnt);
return 0;
}
调试了四五十分钟。终于调好了。
#include <stdio.h> #include <math.h> int main() { int n = 0; scanf("%d", &n); int i = 0; int factor = 0;//记录公因数 int sum = 0;//记录公因数的和 int count = 0;//记录完全数的个数 for (i = 2; i <= n; i++) { sum = 1;//1是所有数的公因数 for(factor = 2; factor <= sqrt(i); factor++)//当公因数大于数的平方根后会重复,不需要遍历 { if (0 == i % factor) { sum += factor; if (factor != sqrt(i))//公因数与数的平方根相等时只能加一次 sum += (i / factor); } } if (sum == i) count++; } printf("%d\n", count); return 0; }