都好多天没有写了,虽然感觉又好多的事情要做,却不知道该从哪里开始去做,想到了华为的机试题,然后,又过来做道。
题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )最后一个数后面也要有空格
详细描述:
函数接口说明:public String getResult(long ulDataInput)
输入参数:long ulDataInput:输入的正整数
返回值:String
题目分析:
首先,看到这道题目,我们可以想到的第一件事情就是,质数,如何判断质数,因为我们要找到一个数的因子,而这个因子必须是质数,所以,我们先写出判读一个数是不是质数,当然,判断质数是比较简单的,我考虑到,要用好几次,然后就抽出一个方法,专门用于判断是不是质数,返回是boolean类型的值,定义如下: static boolean isPrime(long num),我们设置为静态方法。接着,我们接受一个long类型的整数,然后去除以质数,如何选择质数,我们从p=2开始,判断p++是不是质数,如果是,则把num进行相处,直达不能整除为止,如果不是,则一直p++,知道P++为质数为止。第二步要做的就是,当最后的一个为质数,或者出完为一时,我们循环结束。
在这道题目当中,由于要输出的是字符串,我们自然想到String,可是我们要不停的网字符串后面拼接,显然用String类型效率较低,我们考虑使用StringBuilder类,借用append方法进行拼接,效率较高。使用这个的第二个问题是,append里面需要接收一个String类型的,可是我们得到的是int类型或者long类型,需要转化为Sting,我们使用的方法是Integer.toString()方法和String.valueOf()方法。
具体代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(http://System.in);
long num = scanner.nextLong();
boolean flag = true;
int p = 2;
StringBuilder out = new StringBuilder();
while(flag){
if (num%p==0) {
num = num/p;
out.append(Integer.toString(p)).append(" ");
}else {
p++;
if(!isPrime(p)){
p++;
}
}
if(isPrime(num)){
if (num == 1) {
flag = false;
}else {
out.append(String.valueOf(num)).append(" ");
flag = false;
}
}
}
System.out.print(out.toString());
scanner.close();
}
static boolean isPrime(long num){
for (int i = 2; i < Math.sqrt(num)+1; i++) {
if (num%i==0) {
return false;
}
}
return true;
}
}
,实验结果仿真如下:
知识点总结:
对于经常使用的方方,可以抽取出来,提高代码的重用性,对于工具类的方法,可是使用static静态方法;
static boolean isPrime(long num){
for (int i = 2; i < Math.sqrt(num)+1; i++) {
if (num%i==0) {
return false;
}
}
return true;
}
一个数的平方根: Math.sqrt();
使用字符串拼接,常用的类型为:StringBuilder;进行拼接用append(),将StringBuilder转化为String类型用.toString();