首页 > 试题广场 >

完全数计算

[编程题]完全数计算
  • 热度指数:158125 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}完全数,又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)之和恰好等于它本身。

\hspace{15pt}现在,你需要计算 1n 之间完全数的个数。

输入描述:
\hspace{15pt}输入一个整数 n \left(1 \leqq n \leqq 5 \times 10^5\right)


输出描述:
\hspace{15pt}输出一个整数,代表区间内完全数的个数。
示例1

输入

1000

输出

3

说明

\hspace{15pt}第一个完全数是 6,因为 6 的约数有 1, 2, 3, 6,去除本身后,剩余约数之和为 1+2+3=6
\hspace{15pt}第二个完全数是 28,因为 28 的约数有 1, 2, 4, 7, 14, 28,去除本身后,剩余约数之和为 1+2+4+7+14=28
#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);
}
暴力解法,苦苦电脑,解放人脑
发表于 2025-01-12 13:34:04 回复(0)
#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;
}
完全数的判断的小优化:
道题的关键在于完全数的判断:完全数指的是一个数字的所有约数的和和自身相等。我们只需要从 1 开始将这个数的约数相加求和即可。约数就是能够被数字整除,而这里简化的一个思路是数字能够被整除,则除数和结果就都是约数,这种思路下,只需要从1计算到平方根即可比如:数字 8 , 能够整除 2 ,结果是 4 ,则除数 2 和结果 4 都是约数,而这两个只需要一次计算判断即可。需要注意的是 4925... 这种,除数和结果相同的情况,则除数或者结果只相加一次就够了
发表于 2024-10-19 13:50:32 回复(0)
一遍拿下 爽的
#include <stdio.h>
int main() {
    int n,count=0;
    int temp=0;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++){
                if(i%j==0){
                    temp+=j;
                }
            }    
            if(temp==i){
                count++;
            }
            temp=0;
        }
    }
    printf("%d",count);
    return 0;
}

发表于 2024-09-19 14:55:48 回复(0)
 #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 <= i/2; j++)
        {
            if(i % j == 0)
            {
                sum += j;
                
            }
        }
        if(sum == i)
            count++;
    }
    printf("%d\n", count);
    return 0;
}

发表于 2024-09-02 00:48:53 回复(0)
一遍过,很开心
#include <stdio.h>
int getrealnum(int a) {
    int i = 1;
    int count = 0;
    for (i = 1; i < a; i++) {
        if (a % i == 0) {
            count += i;
        }
    }
    if (count == a) {
        return 1;
    }else{
        return -1;
    }
}

int main() {
    int n;
    int len=0;
    scanf("%d", &n);
    for(int j=1;j<=n;j++){
        if(getrealnum(j)==1){
            len++;
        }
    }
    printf("%d", len);
    return 0;
}
发表于 2024-08-07 20:43:35 回复(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;
}

编辑于 2024-03-11 23:09:43 回复(0)
#include<stdio.h>
int func(int m)
{
    int sum=0;
    for(int i=1;i<m;i++)
    {
        if(m%i==0)
            sum+=i;
    }
    if(sum==m)
        return 1;
    else
        return 0;
}
int main()
{
    int temp=0;
    int arr[500000]={0};
    int n=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        arr[i]=i;
    for(int j=1;j<n;j++)
    {
        temp+=func(arr[j]);
    }
    printf("%d",temp);
    return 0;
}
发表于 2024-02-10 20:55:11 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    long long n = 0;
    scanf("%lld", &n);
    int a = 0;
    int count = 0;
    for (int i = 1; i <= n; i++)
    {
        int j = 1;
        for (j = 1; j < i; j++)
        {
            if (i % j == 0)
            {
                a += j;
            }
        }
        if (a == i)
        {
            count++;
            
        }
        a = 0;
    }
    printf("%d", count);
    return 0;
}
发表于 2024-01-16 10:27:36 回复(1)
#include<stdio.h>

int main(){
    int n,cnt=0;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<n+1;i++){
            int sum=0;//cnt=0;
            for(int j=1;j<i;j++){
                if(i % j == 0){
                    sum=sum+j;
                    //cnt++;
                }
            }
            if(sum == i){              
                cnt++;
            }
        }
        printf("%d",cnt);
    }
    return 0;
}
发表于 2023-11-23 11:19:50 回复(0)
#include <stdio.h>

int main() {
    int num = 0;
    while (scanf("%d", &num) != EOF) {
        int ret = 0;
        if(num<6)
        {
            printf("0\n");
        }
        else
        {
            for(int i = 6;i<=num;i++)
            {
                int tmp = 0;
                for(int j = 1;j<= i/2;j++)
                {
                    if(i%j == 0)
                    {
                        tmp += j;
                    }
                }
                if(tmp == i)
                {
                    ret++;
                }
            }
        }
        printf("%d\n",ret);
    }
    return 0;
}
发表于 2023-10-11 20:53:08 回复(0)
#include <stdio.h>
int isPerfect(int n)//判断是否为完全数
{
    int sum=0,flag=0;
    for(int i=1;i<=n/2;i++)
    {
        if(n%i==0)
            sum+=i;
    }
    if(n==sum)
        flag=1;
    return flag;
}
int main() {
    int n,count=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        if(isPerfect(i))
            count++;
    }
    printf("%d",count);
    return 0;
}
发表于 2023-09-04 21:44:27 回复(0)
#include <stdio.h>

int main()
{
        int n;
        scanf("%d", &n);
        if(n < 28)
        {
                printf("1");
        };
         if(n < 496 && n >= 28)
        {
                printf("2");
        };
         if(n < 8128 && n >= 496)
        {
                printf("3");
        };
        return 0;
}
发表于 2023-06-10 16:26:49 回复(1)
#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;
}

发表于 2023-04-12 13:30:43 回复(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;

}

```
#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;
}
调试了四五十分钟。终于调好了。

发表于 2023-03-15 17:44:03 回复(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;
}

发表于 2022-07-23 16:43:04 回复(0)
#include <stdlib.h>
#include <stdio.h>
  
int main(void)
{
    int n;
    scanf("%d",&n);
    int s = 1,i = 0;
    int count = 0;
    do
    {
        s = 1;
        for(i = 2; i < n/i; i++ )
        {
            if(n%i == 0)
            {
                s += (i+n/i);             
            }
            if(s > n) break;
        }
        if(s!= 1 && s == n )
        {
            count++;
        }
    }while(--n);
      
    printf("%d\n",count);
    return 0;
}

发表于 2022-06-18 11:34:09 回复(0)

问题信息

难度:
35条回答 33135浏览

热门推荐

通过挑战的用户

查看代码
完全数计算