重写写了个JAVA算法,效率很理想。
不过long只能支持到10的18次方
运行环境:E8400 + 4G RAM + JDK 1.5 + XP SP3(公司的机子就是牛啊!!!!)
import java.util.ArrayList;
import java.util.List;
public class Submultiple {
public static void main(String args[]){
long start = System.currentTimeMillis();
int[] primeNumAry = new int[64];
get64PrimeNumber(primeNumAry);
long num = 1000000000000000000L;
long orgNum = num;
int facCount = 0;
List
for(int index = 0, factor = primeNumAry[index]; num != 1; ){
if(num % factor == 0){
facCount++;
num = num /factor;
if(num == 1){
list.add(facCount);
}
continue;
}else{
list.add(facCount);
factor = primeNumAry[++index];
facCount = 0;
}
}
long totalCount = 1L;
for(int item: list){
totalCount *= (item + 1);
}
long end = System.currentTimeMillis();
System.out.println("For number " + orgNum + ", Total " + (end - start)
+ " million seconds for " + totalCount + " submultiples");
}
private static void get64PrimeNumber(int[] primeNumAry) {
Label1: for(int i = 2, count = 0; count < 64; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
continue Label1;
}
}
primeNumAry[count++] = i;
}
}
}
--------------
For number 1000000000000000000, Total 0 million seconds for 361 submultiples
(20加1)×(20加1)