2 sonofbaba sonofbaba 于 2017.09.08 15:16 提问

华为机试算法 小弟有点不明白我哪里写错了

public class Main{

public static void main(String[] args) { retu(); }
private static String retu() {
String rec="";
Scanner scan=new Scanner(System.in);

while(scan.hasNext())

{

int num=scan.nextInt();
for(int i=2;i<=num;i++){
if((num%i==0)&&(judge(i)==true)) {
num=num/i;
rec+=i+" ";
}
}
rec.split(" ");
}
return rec;

}
public static boolean judge(int number){
boolean flag=true;
if(number<2){
return false;
}
for(int i=2;i<=Math.sqrt(number);i++)
{
if(number%i==0){
flag=false;
break;
} }
return flag;

}
}

要求是:
    输入描述:

输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入

180
输出

2 2 3 3 5

4个回答

s576816371
s576816371   2017.09.08 15:59

所有质素因子和因式分解不是一个东西啊。 这个可以将初始数开方,小的因数一方和大的因数一方分别判断是否为质素。

主要逻辑比如像这样:

private static String retu(int num) {
String rec="";
String last="";
int maxlower = (int) Math.sqrt(num);
for(int i=2;i<=maxlower;i++){
if((num%i==0)) {
if(judge(i)){
rec+=i+" ";
}
int lastnumber = num/i;
if(judge(lastnumber)){
last = " " + lastnumber + last;
System.out.println(last);
}
}
}
rec += last;
return rec;

}

u010656360
u010656360   2017.09.08 16:01

1.题目不是Long型整数吗 long num = scan.nextLong();
2.你这个没有输出啊,没看到任何的sout
3.要求从小到大,你这段代码,num=num/i;之后i还是会++的,另外你这个for循环次数太多了,正常的算法应该是:计算质数(维护一个质数列表),只要能整除,就保存整除后的值,如果是质数直接停止,否则从质数列表的第一个开始继续计算
有些代码风格的问题,judge(i) == true 直接去掉 == true, 多个字符串变量拼接尽量不要+=,stringbuffer和stringbuilder欢迎你使用,但是这道题完全可以算一个就输出一个,没必要拼字符串统一输出
另外这个rec.split(" ");没有看懂是要干啥,spilit是从返回值拿结果,不能改变string对象本身,string的本质是一个final的char[],没法改变值,只能重新引用

zy841958835
zy841958835   Ds   Rxr 2017.09.08 16:09

楼主 注意题设 是所有质数 因子 不是所有的质数因子只积为当前的数
比如说 48 的所有质数因子是 2 3 7.。。

qhluo
qhluo   2017.09.08 16:56

第一,循环没进去所以没有结果,第二,没有输出结果的语句,就算有结果,也不会打印

Csdn user default icon
上传中...
上传图片
插入图片