for(int i=0;i<10000;i++) //在0-10000中遍历
{
int half = i/2+1; //一个数的最大因数应该不会大于其1/2(不影响程序结果,用于优化速度)
int tempresult = 0; //临时结果(中间变量)
for(int j=1;j
if(i%j==0) //如果能被j整除,累加j的值保存到tempresult
{
tempresult+=j;
}
}//此for循环结束,累加了所有j的值(因数的和)
if(tempresult==i)
{
//处理一个完数的逻辑代码,或者保存到数组,或者其他
}
}
因数的概念记不清了,重新搜索了一下概念,惭愧。
我这里没有开发环境, 不能用Java去写了,用我熟悉的C#结构去写了,但是算法基本差不太多,需要作者细心修改一下。
(修改)刚刚还没有答案,写完了一看,好几楼了,呵呵
public class Test {
public java.util.ArrayList
public void getFactor(int input) {
tmp.clear();
for(int i = 1; i < input / 2 + 1; ++i)
if(input%i == 0) tmp.add(i); //求输入的整数的所有因子,并存入tmp中,每次求时需要将tmp置空
}
public boolean perfect(int input) {
int result = 0;
for(int i = 0; i < tmp.size(); ++i) {
result += tmp.get(i); //将当前tmp中的所有因子相加
}
if(result == input) return true; //如果相加与当前输入相同,则输入数为完数,反之不然
else return false;
}
public static void main(String[] args) {
Test test = new Test();
for(int i = 1; i < 1000; ++i) {
test.getFactor(i); //从1到1000求完数
if(test.perfect(i)) System.out.println(i);
}
}
}
测试结果,三个完数:
6
28
496
package firstDay;
import java.util.ArrayList;
import java.util.List;
public class WanShu {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//测试1000以内的完数
WanShu ws = new WanShu();
for (int i = 0; i < ws.wanShu().size(); i++) {
int wanshu=((Integer)ws.wanShu().get(i)).intValue();
StringBuffer sb=new StringBuffer();
for(int j=1;j
sb.append(j+"+");
}
}
String result=sb.toString();
System.out.println(result.substring(0,result.length()-1)+"="+ ws.wanShu().get(i));
}
}
public List wanShu() {
// 存放完数的集合
List wanShu = new ArrayList();
// 因子累加的变量
int count = 0;
// 求完数
for (int i = 1; i <= 1000; i++) {
// 求因子
for (int j = 1; j < i - 1; j++) {
if (i % j == 0) {
count += j;
}
}
// 次数因子和等于它本身,就算作因子
if (count == i) {
wanShu.add(new Integer(i));
}
count = 0;
}
return wanShu;
}
}
//结果
//1+2+3=6
//1+2+4+7+14=28
//1+2+4+8+16+31+62+124+248=496