完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
数据范围:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
输入一个数字n
输出不超过n的完全数的个数
1000
3
约束条件: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; }
#include<stdio.h> #include<math.h> int main() { int num; while(~scanf("%d", &num)){ if(num==1){printf("0\n");break;} int count = 0; for(int i=2; i<=num; i++){ int sum = 1,root = sqrt(i); // 求约数遍历到根值即可 for(int j=2; j<=root; j++){ if(i%j==0){ sum +=j; //与约数j相加 if(i!=root) //防止两个相同的约数重复计算 sum +=(i/j); //与约数j对应点另一个约数相加 } } if(sum == i)count++; } printf("%d\n", count); } }
#include<stdio.h> int main() { int n=0; while(~scanf("%d",&n)) { int count = 0; for (int i = 1; i<=n; i++) { int sum = 0; for (int j = 1; j<i; j++) { //只要整除就是约数,把约数相加 if (i%j == 0) { sum += j; } } //如果sum跟i相等就是完全数 if (sum == i) count++; } printf("%d\n", count); } return 0; }
#include <stdio.h> int Perfectnumber(int i) //判断是否为完全数 { int sum = 0; for (int j = 1; j<i; j++) //从1开始<i,直接忽略i本身 { if (i%j == 0) { sum += j; //约数相加 } } if (sum == i) //判断是否为完全数 return 1; return 0; } int main() { int n = 0; while (scanf("%d", &n) != EOF) //多组输入 { int count = 0; //计数 for (int i = 1; i <= n; i++) //大循环,判断从 1 到 n { int ret = Perfectnumber(i); //判断一个数是否为完全数,返回1或0 count += ret; //是则计数+1 } printf("%d\n", count); } return 0; }