//判断一个数是不是质数
function isPrime(number){
if(number===1){
return false;
}
const len = Math.floor(Math.sqrt(number));
let flag = true;
for(let i=2;i <= len;i++){
if(number%i===0){
flag = false;
break;
}
}
return flag;
}
//得到某个数的质因子
function getPrime(number){
let arr=[];
let i=2;
//判断number本身是不是质因子
if(isPrime(number)){
arr.push(number);
}
//否则获得number的质因子
while(i<=Math.floor(number/2)){
if(number%i===0 && isPrime(i)){
arr.push(i);
}
i++;
}
return arr;
}
//求并集
function union(arr1,arr2){
let unionList=[];
for (let i = 0; i < arr1.length; i++) {
unionList.push(arr1[i]);
}
for (let i = 0; i < arr2.length; i++) {
if(unionList.indexOf(arr2[i])<0){
unionList.push(arr2[i])
}
}
return unionList;
}
//静态求解
function statistics(n){
//arr为获得数列表
let arr=[];
//primeList质数存储列表
let primeList = [];
let all=0;
//将输入的三个结果放入列表
for(let i=0; i<n;i++){
let number = parseInt(prompt());
arr.push(number);
primeList.push(getPrime(number))
all += primeList[i].length;
}
//向列表中放入其他相乘后的结果
for(let i=0;i < n-1;i++){
let b = arr[i];
let buffer = primeList[i];
let flag = true;
for (let j = i+1; j < n; j++) {
if(b*arr[j] ===arr[i]*arr[j] && flag ){
all += union(primeList[i],primeList[j]).length;
flag=false;
}else{
all += union(primeList[i],primeList[j]).length;
all += union(buffer,primeList[j]).length;
}
b*=arr[j];
if(isPrime(arr[j])){
buffer.push(arr[j]);
}else{
buffer = union(buffer,primeList[j]);
}
}
}
return all;
}
//console.log(statistics(3));
console