所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(0<m<=n<=10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。
输入样例:
1 30
输出样例:
1 = 1 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14
超时解:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //整数 m,n 0<m<=n<=10000 int m = scanner.nextInt(); int n = scanner.nextInt(); int sum=0; for(;m<=n;++m) { ArrayList<Integer> result = new ArrayList<Integer>(); sum =m; if(m==1) System.out.println("1 = 1"); else { for(int i=1;i<=m/2 ;i++) { if(m%i==0) { sum = sum-i; result.add(i); } } if(sum==0) { System.out.print(m); System.out.print(" ="); for(int i=0;i<result.size();i++) { System.out.print(" "+result.get(i)); if(i<result.size()-1) { System.out.print(" +"); } } System.out.println(""); } result = null; } } } }
正确解:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //整数 m,n 0<m<=n<=10000 int m = scanner.nextInt(); int n = scanner.nextInt(); int sum=0; for(;m<=n;++m) { ArrayList<Integer> result = new ArrayList<Integer>(); sum =1; if(m==1) System.out.println("1 = 1"); else { //先求因子和 for(int j=2;j<=Math.sqrt(m);j++) { if(m%j==0) { sum = sum+j; int temp = m/j; if(temp >j && temp<m) { sum= sum+temp; } } } //如果因子和等于 m,是完数 if(sum!=m) { continue; } //找因子 for(int i=1;i<=m/2 ;i++) { if(m%i==0) { result.add(i); } } System.out.print(m); System.out.print(" ="); for(int i=0;i<result.size();i++) { System.out.print(" "+result.get(i)); if(i<result.size()-1) { System.out.print(" +"); } } System.out.println(""); result = null; } } } }
原文:http://blog.csdn.net/ch717828/article/details/44175457