题目来源:
参考:http://blog.csdn.net/rabbit8848/article/details/38552991
所谓完数就是该数恰好等于除自身外的因子之和。例如: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/rabbit8848/article/details/38552991