首页 > 试题广场 >

完全数计算

[编程题]完全数计算
  • 热度指数:155014 时间限制: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
import java.util.Scanner;
import java.util.HashSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int count = 0;
        for (int i = 1; i <= n; i++) {
            int sum = 0;
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0 && i != j) {
                    sum += j;
                }
            }
            if (sum == i) {
                count++;
            }
        }
        System.out.println(count);
    }
}
发表于 2024-09-29 16:10:04 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            if (a < 6) System.out.println("0");
            else if (a < 28) System.out.println("1");
            else if (a < 496) System.out.println("2");
            else if (a < 8182) System.out.println("3");
            else System.out.println("4");

            // int num = in.nextInt();
            // int count = 0;
            // for (int i = 1; i <= num; i++) {
            //     int sum = 0;
            //     for (int j = 1; j <= i/2; j++) {// 约数
            //         if (i % j == 0) {
            //             sum += j;
            //         }
            //     }
            //     if (sum == i) {
            //         count++;
            //     }
            // }
            // System.out.println(count);
        }
        in.close();
    }
}
发表于 2024-09-12 16:42:35 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int number = in.nextInt();
        int count = 0;
        for (int i = 1; i <= number; i++) {
            int sum = 0;
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    sum += j;
                }
            }
            if (i == sum)
                count++;
        }
        System.out.println(count);
    }
}

发表于 2024-07-07 15:59:47 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int count = 0;
            // 遍历小于等于n的数
            for (int i = 1; i <= n; i++) {
                int sum = 0;
                // 计算因数之和
                for (int j = 1; j <= i / 2 ; j++) {
                    if (i % j == 0) {
                        sum += j;
                    }
                }
                //因数之和等于本身+1
                if (sum == i) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}


发表于 2024-04-09 16:55:35 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int num = in.nextInt();
            int count = 0;
            for(int i =2; i<=num; i++) {  //遍历n
                //求i的约数,存于数组中
                int arr[] = new int[i/2];
                for(int j=1,n=0; j<=i/2; j++) {
                    if(i%j == 0) {
                        arr[n] = j;
                        n++;
                    }
                }
                //遍历数组求和,判断是否==i
                int sum = 0;
                for(int x = 0; x < arr.length; x++) {
                    sum = sum + arr[x];
                }
                if(sum == i) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}

发表于 2023-10-30 16:21:13 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            if(a < 6) System.out.println("0");
            else if(a<28) System.out.println("1");
            else if(a<496) System.out.println("2");
            else if(a<8182) System.out.println("3");
            else System.out.println("4");
        }
    }
}

发表于 2023-10-16 09:39:24 回复(2)
import java.util.*;
import java.util.stream.Collectors;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int total = in.nextInt();
        List<Integer> totalList = new ArrayList<>(total);

        for (int i = 1; i < total; i++) {
            totalList.add(i);
        }
        List<Integer> resultList = totalList.stream().map(item-> {
            List<Integer> yues = new ArrayList<>(item);
            for (int i = 1; i < item; i++) {
                if (item % i == 0) {
                    yues.add(i);
                }
            }
            if (yues.stream().reduce(0, Integer::sum) ==  item) {
                return item;
            } else {
                return 0;
            }
        }).filter(item -> item != 0).collect(Collectors.toList());

        System.out.println(resultList.size() + 1);

    }
}

发表于 2023-10-13 14:44:36 回复(0)
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            int number = Integer.parseInt(line);
            int count = 0;
            for (int i = 2; i <= number; i++) {
                int sum = 0;
                for (int j = 1; j <= Math.sqrt(i); j++) {
                    if (i % j == 0) {
                        sum += j;
                        if (i / j != i) {
                            sum += i / j;
                        }
                    }
                }

                if (i == sum) {
                    count++;
                }
            }

            System.out.println(count);
        }
    }
}

发表于 2023-08-10 15:32:29 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int num=in.nextInt();
        int sum=0;
        for(int i=1;i<=num;i++){
            if(getResult(i)==i){
                sum++;
            }
        }
        System.out.print(sum);
    }
    public static int getResult(int num){
        int sum=0;
        for(int i=1;i<num;i++){
            if(num%i==0){
                sum+=i;
            }
        }
        return sum;
    }
}

发表于 2023-06-02 16:55:52 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int count = 0;
        for(int i = 2; i <= n; i++){
            if(isPerfect(i)) count++;
        }
        System.out.print(count);
    }

    public static boolean isPerfect(int num){
        int sum = 0;
        for(int i = 2; i*i <= num ; i++){
            if(num % i == 0){
                sum += i;
                if(num / i != i){
                    sum += (num/i);
                }
            }
        }
        sum++;
        return sum == num;
    }
}



发表于 2023-04-19 10:20:01 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int count=0;
            for(int i=2;i<=n;i++){
                if(isPerfect(i)) count++;
            }
            System.out.println(count);
        }
    }
    public static boolean isPerfect(int num){
        ArrayList<Integer> list = new ArrayList<>();
        for(int k=1;k<=num/2;k++){
            if(num%k==0){
                list.add(k);
            }
        }
        int sum=0;
        for(int a:list){
            sum+=a;
        }
        if(sum==num) return true;
        return false;
    }
}

发表于 2023-04-09 11:25:40 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int count = 0;
            for (int i = 1; i <= a; i++) {
                if (wanquanshu(i)) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }

    private static boolean wanquanshu(int a) {
        int sum = 0;
        int len = a / 2;
        for (int i = 1; i <= len; i++) {
            if (a % i == 0) {
                sum += i;
            }
        }
        if (sum == a)
            return true;
        else
            return false;
    }
}

发表于 2023-03-14 22:43:08 回复(0)
/**
 * @author YXQ
 * @create 2022/8/22  17:05
 */

import java.util.Scanner;

/**
 * HJ56 完全数计算
 * 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
 * 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
 * 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
 * 输入n,请输出n以内(含n)完全数的个数。
 *
 * 输入描述:
 * 输入一个数字n
 * 输出描述:
 * 输出不超过n的完全数的个数
 *
 *输入:
 * 1000
 * 输出:
 * 3
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(getPefectNum(n));
    }
    public static int getPefectNum(int n){
        int res=0;
        if(n==1)return 0;
        for(int i=2;i<=n;i++){
            int sum=1;
            for(int j=2;j<=Math.sqrt(i);j++){
                if(i%j==0){
//                     注意不要把开平方的两个数都加进来了
                    if(Math.abs(Math.sqrt(i)-j)<Double.MIN_VALUE){
                        sum+=(i/j);
                    }else{
                        sum+=(i/j+j);
                    }
                }
            }
            if(sum==i)res++;
        }
        return res;
    }
}

暴力求解

发表于 2022-08-22 17:28:53 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        int count = 0;
        for(int i = 1; i <= num; i++){
            if(isPerfectNumber(i)){
                count++;
            }
        }
        System.out.println(count);
    }
    
    public static boolean isPerfectNumber(int num){
        int sum = 0;
        for(int i = 1; i < num; i++){
            if(num % i == 0){
                sum += i;
            }
        }
        return sum == num;
    }
}

发表于 2022-08-16 10:39:59 回复(0)
搞一个循环计算sum,sum = sum + Math.pow(2, i)(i从0开始)当sum判断为素数的时候,可以得到一个完全数,值为sum * Math.pow(2, i);
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int br = Integer.parseInt(scanner.nextLine());
        int count = 0;
        int sum = 0;
        for(int i = 0;;i++){
            boolean ifContinue = false;
            sum += Math.pow(2, i);
            if (sum * Math.pow(2, i) > br){
                break;
            }
            for(int j = 2; j < Math.sqrt(sum) + 1; j++){
                if(sum % j == 0){
                    ifContinue = true;
                    break;
                }
            }
            if(ifContinue ){
                continue;
            }
            count++;
        }
        System.out.println(count - 1);
    }
}

发表于 2022-07-11 20:30:49 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int num = sc.nextInt();
            int count = 0;
            for (int i = 2; i <= num; i++) {
                int temp = 0;
                List<Integer> array = new ArrayList<>();
                for (int j = 1; j < i; j++) {
                    if (i % j == 0) {
                        array.add(j);
                    }
                }
                for (Integer t : array) {
                    temp += t;
                }
                if (temp == i) {
                    count += 1;
                }
            }
            System.out.println(count);
        }
    }
}

发表于 2022-06-26 13:26:53 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        for (int i = 2; i <= n; i++) {
            int sum = 1;
            for (int j = 2; j <= (int) Math.sqrt(i); j++) {
                if (i % j == 0) {
                    sum += j;
                    sum += i / j;
                }
                if (sum > i) break;
            }
            if (sum == i) {
                count++;
            }
        }
        System.out.println(count);
    }
}

发表于 2022-06-24 08:58:39 回复(0)
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class Main{
    public static void main(String[]args){
        Scanner scan = new Scanner(System.in);
        int num =scan.nextInt();
        int total=0;
        for(int i=1;i<=num;i++){
            List<Integer>list = new ArrayList<Integer>();
            int sum =0;
            for(int j=1;j*2<=i;j++){
                if(i%j==0){
                    list.add(j);
                }
            }
            for(int li:list){
                sum+=li;
            }
            if(sum==i){
                total++;
            }
        }
        scan.close();
        System.out.println(total);
    }
}

发表于 2022-06-09 22:47:45 回复(0)
import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        long num = sc.nextLong();
        int count =0;
        if(num >=2) {
            for (int i = 2; i <= num; i++) {
                if (resolve(i) == i) {
                    count++;
                }
            }
        }
        System.out.println(count);
    }

    //求出当前所有真因子的和
    public static long resolve(long num) {
        long sum = 1;
        if(num == 2 || num ==3){return 1;}
        else {
            for (int i = 2; i <= (int) Math.sqrt(num); i++) {
                if (num % i == 0) {
                    sum = sum + i + num / i;
                }
            }
            return sum;
        }

    }
}



发表于 2022-06-01 10:30:05 回复(0)

问题信息

难度:
67条回答 32048浏览

热门推荐

通过挑战的用户

查看代码
完全数计算