價值之和
題目
D. 試題D:價值之和 10'
描述
【問題描述】
定義數字x的價值爲其不同質因子的個數。
例如:數字20202020可以寫成2020=2*2*5*1012020=2∗2∗5∗101,其價值爲33.
JM boy請你幫忙計算整數11到20202020中,所有都不包含數字55的正整數的價值之和。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果爲一個整數(提示:答案最後一位數是奇數),在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
思路
篩每一位值與篩素數,寫起來感覺很麻煩,不知道有簡單點的方法不,似乎可以用python 一行秒殺
代碼
import java.util.*;
public class 價值之和 {
public static void main(String[] args) {
int [] prime=getPrime(10000);
int value=0;
for(int i=2;i<=2020;i++) {
if(isOkay(i))
value+=getValue(i, prime);
}
System.out.println(value);
}
public static boolean isOkay(int n) {
int tmp=n;
while(tmp!=0) {
int last=tmp%10;
if(last==5)return false;
tmp/=10;
}
return true;
}
public static int getValue(int n, int[] prime) {
int tmp = n;
int count=0;
boolean [] bool=new boolean[2025];
while (tmp != 1) {
for (int i = 0; i < prime.length; i++) {
if (tmp % prime[i] == 0) {
tmp /= prime[i];
if(bool[prime[i]]==false) {
count++;bool[prime[i]]=true;}
break;
}
}
}
return count;
}
public static int[] getPrime(int n) {
boolean[] list = new boolean[n + 1];
int[] prime = new int[n + 1];
int count = 0;
for (int i = 2; i <= n; i++) {
if (list[i] == false) {
prime[count++] = i;
}
for (int j = 0; j < count && i * prime[j] <= n; j++) {
list[i * prime[j]] = true;
if (i % prime[j] == 0)
break;
}
}
int[] re = new int[count];
for (int i = 0; i < count; i++)
re[i] = prime[i];
return re;
}
}