输入一个整数
。
输出一个整数,代表区间内完全数的个数。
1000
3
第一个完全数是
,因为
的约数有
,去除本身后,剩余约数之和为
。
第二个完全数是
,因为
的约数有
,去除本身后,剩余约数之和为
。
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
int i,j;
int sum,num=0;
for(i=1;i<=a;i++){
for(j=1,sum=0;j<=i/2;j++){//不会有大于自身一半的因数
if(i%j==0){
sum=sum+j;
}
}
if(sum==i){num++;}
}
printf("%d",num);
return 0;
} #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;
}