价值之和
题目
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;
}
}