课本上的一个题目不会做

Y382904800 2008-03-07 07:21:03
输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:其所有数位上的数字和=其全部素数因子的数字总和
例如:9975是Smith数,9975=3*5*5*7*19 ,即全部素数因子的数字总和。
...全文
108 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
haisenmai 2008-03-07
  • 打赏
  • 举报
回复
http://www.java-cn.com/bbs-jsp/show.jsp?id=144949
haisenmai 2008-03-07
  • 打赏
  • 举报
回复
[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

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧