华为-完全数
(java实现)
题目描述:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。s
输入n,请输出n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
本题输入含有多组样例。
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数
示例1:
输入
1000 7 100
输出
3 1 2
问题分析:
思路一:暴力法(枚举法)。直接根据题意进行遍历计算,但是这个方法容易超时。
思路二:利用欧拉的公式:如果i是质数,2^i-1也是质数,那么(2^i-1)*2^(i-1)就是完全数。
相关知识:
略
算法实现:
略
参考代码:
思路一实现():
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNext()) { int n = input.nextInt(); int count = 0; for (int i=1; i<n; i++) { int sum = 0; for (int j=1; j<i; j++) { if (0 == i%j) { sum += j; } } if (sum == i) { count++; } } System.out.println(count); } } }
思路二实现:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNext()) { int num = input.nextInt(); int a,b; int sum = 0; //存储完全数的个数 for (int i=1; i<=num; i++) { a = (int)Math.pow(2,i-1); b = (int)Math.pow(2,i)-1; if (a*b > num) { break; } else { if (isPrime(i) && isPrime(b)) sum++; } } System.out.println(sum); } } //判断是否是质数(素数) public static boolean isPrime(int n) { if (1 == n) return false; boolean flag = false; for (int i=2; i<n; i++) { if (0 == n%i) { flag = true; break; } } if (flag) return false; return true; } }