课本上的一个题目不会做 输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:其所有数位上的数字和=其全部素数因子的数字总和例如:9975是Smith数,9975=3*5*5*7*19 ,即全部素数因子的数字总和。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 [java学习]给人写的求400内的SMITH数素数判定算法比较臭,时间复杂太大...算很大的数会等到你吐血,求改进版 /** *SMITH.java *Author:ArEs */ import java.util.ArrayList; public class SMITH{ //取得素数因子表public ArrayList getPrimeFactor(int num){ ArrayList pfList=new ArrayList(); int pf=2; if(isPrime(num)){ pfList.add(0,num); return pfList; } while(pf<num){ if(isPrime(pf)){ if(num%pf==0){ pfList.add(pf); num/=pf; pf=1; if(isPrime(num)){ pfList.add(num); break; } } } pf++; } return pfList; } //各位上的数字之和public int getBitAdd(int num){ int sum=0; while(num!=0){ sum+=num%10; num/=10; } return sum; } //素数判断public boolean isPrime(int num){ int i=2; if(num<=1)return false; for(;i<num;i++){ if(num%i==0)break; } if(i<num)return false; else return true; } public static void main(String []args){ int smith=2; int pf=0; SMITH s=new SMITH(); ArrayList pfList=new ArrayList(); while(smith<400){ pfList=s.getPrimeFactor(smith); pf=0; for(int i=0;i<pfList.size();i++){ pf+=s.getBitAdd(Integer.parseInt(pfList.get(i).toString())); //这里有没有其他方法?}; if(s.getBitAdd(smith)==pf){ System.out.println (smith+"\t"+pfList); } smith++; } } } //http://blog.donews.com/ArEs/archive/2005/06/07/416438.aspx http://www.java-cn.com/bbs-jsp/show.jsp?id=144949 关于new关键字 Applet重绘问题 把object数组转换为内存流的问题? 编程时遇到个小问题,请大侠们指教下 软件开发课题 关于FileOutputStream (答案选社么,原因) 请教用Java获得IP的小问题! 请问这是什么意思?有什么影响? 谁能告诉我为什么? 创建方法比较两个字符串是否相等 java -jar 启动dos窗口的问题 servlet处理表单出现问题
素数判定算法比较臭,时间复杂太大...算很大的数会等到你吐血,求改进版
/**
*SMITH.java
*Author:ArEs
*/
import java.util.ArrayList; public class SMITH{
//取得素数因子表
public ArrayList getPrimeFactor(int num){
ArrayList pfList=new ArrayList();
int pf=2; if(isPrime(num)){
pfList.add(0,num);
return pfList;
}
while(pf<num){ if(isPrime(pf)){
if(num%pf==0){
pfList.add(pf);
num/=pf;
pf=1;
if(isPrime(num)){
pfList.add(num);
break;
}
}
}
pf++;
}
return pfList;
}
//各位上的数字之和
public int getBitAdd(int num){ int sum=0;
while(num!=0){
sum+=num%10;
num/=10;
}
return sum;
} //素数判断
public boolean isPrime(int num){
int i=2;
if(num<=1)return false; for(;i<num;i++){
if(num%i==0)break;
}
if(i<num)return false;
else return true;
} public static void main(String []args){
int smith=2;
int pf=0;
SMITH s=new SMITH();
ArrayList pfList=new ArrayList(); while(smith<400){ pfList=s.getPrimeFactor(smith);
pf=0;
for(int i=0;i<pfList.size();i++){
pf+=s.getBitAdd(Integer.parseInt(pfList.get(i).toString())); //这里有没有其他方法?
};
if(s.getBitAdd(smith)==pf){
System.out.println (smith+"\t"+pfList);
}
smith++;
}
}
}
//http://blog.donews.com/ArEs/archive/2005/06/07/416438.aspx