Day14:完全数计算

428 阅读1分钟

描述

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。

数据范围: 1 \le n \le 5 \times 10^{5} \1≤n≤5×105 

题源:完全数计算_牛客题霸_牛客网 (nowcoder.com)

输入描述:

输入一个数字n

输出描述:

输出不超过n的完全数的个数

示例1

输入:

1000

输出:

3

思路如下:

Java:

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int ans = 0;
        int N = sc.nextInt();
       for (int i = 1;i < N;i++){
       //判断这个数是不是完全数,若是自增;
           ans += perfect_number(i) ? 1 : 0;
       }
        System.out.println(ans);
    }
    //输入一个数判断是否为完全数;
   static boolean perfect_number(int num){
        int ans = 0;
   //遍历    从1到这个数前一个,因为完全数相加不能包含本身
        for (int i = 1; i < num; i++){
   //若i为num的因子则相加     
            ans += num % i == 0 ? i : 0;
        }
   //若ans == num 返回true;     
        return ans == num;
    }
}

c++代码雷同 :

#include <iostream>
#include <string>
using namespace std;
#include <algorithm>
bool perfect_number(int num) {
	int ans = 0;
	for(int i = 1; i < num; i++) {
		ans += num % i == 0 ? i : 0;
	}
	return ans == num;
}
int main(){	
	int N, ans = 0;
	cin >> N;
	for( int i = 1; i < N; i++) {
		ans += perfect_number(i) ? 1 : 0;
	}
	cout << ans << endl;
}