题目:
我们知道每一个大于1的整数都一定是质数或者可以用质数的乘积来表示,如10=2*5。现在请设计一个程序,对于给定的一个(1,N] 之间的正整数(N取值不超过10万),你需要统计(1,N] 之间所有整数的质数分解后,所有质数个数的总个数。举例,输入数据为6,那么满足(1,6] 的整数为2,3,4,5,6,各自进行质数分解后为:2=>2,3=>3,4=>2*2,5=>5,6=>2*3。对应的质数个数即为1,1,2,1,2。最后统计总数为7
输入描述:
输入数据包含1行,为一个大于1的整数(不超过10万)。
输出描述:
输出小于等于该数的所有整数质数分解后的总个数。
输入例子1:
6
输出例子1:
7
题目分析:
首先我们需要求出一个数(设为x)质数分解后对应的质数个数,这一步需要判断x是不是质数。
(1)如果是质数,则不需要继续判断,直接返回1
(2)如果不是质数,则x一定可以整除一个质数(设这个质数为a),令k= x/a,将k带入步骤(1),并令对应的质数加一(使用递归比较好理解)。
代码:
import java.util.*;
public class test0 {
public static void main(String[] args) {
System.out.println("输入数据包含1行,为一个大于1的整数(不超过10万)");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
int k = 0;
for (int j = 2; j <= i; j++) {
k+=resolveNum(j);
}
System.out.println(k);
}
public static int resolveNum(int i){
if (isPrimeNum(i)){
return 1;
}
int k = 0;
for (int j = 2; j < i; j++) {
if (i%j==0&&isPrimeNum(j)){
k=i/j;
}
}
return 1+resolveNum(k);
}
public static boolean isPrimeNum(int i){
if (i<2){
return false;
}
for (int j = 2; j < i; j++) {
if (i%j!=0){
continue;
}
if (i%j==0){
return false;
}
}
return true;
}
}
输出结果:
首先输入6,结果为
输入数据包含1行,为一个大于1的整数(不超过10万)
6
7
在验证其他值,比如输入8,结果为:
输入数据包含1行,为一个大于1的整数(不超过10万)
8
11
总结:
质数是从2开始判断的,因此应该从2开始循环判断。代码都是我自己想法写的,若有错误的地方欢迎指正!