定义visit[i]数组用于记录i是否已经被用过了
然后用i从2遍历到n遍历
如果i没有被当做质因子用过的话
我们就从i开始,将i的倍数全部标记一下,同时ans每一次都要去加上i,注意不是加i的倍数,而是去加质因子i。
这里特别声明一下java选手不能去用j=ii,因为java的下标只能是int类型,j=ii会爆掉int的。
所以只能牺牲速度去做这道题 不过还好可以过。当然你也可以去选择转为列表再用j=ii;
这里说明一下为什么要从j=ii开始而不是我写的j=i开始。
因为i之前的那些质因子已经遍历过了,他们肯定是不符合条件的,所以直接从i*i开始去找后面那些没有遍历过的。可以节省时间。
import java.math.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
public static void main(String args[])throws IOException
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int n = (int)in.nval;
boolean visit[] = new boolean[n+1];
long ans=0,ci=0;
for(int i=2;i<=n;i++)
{
if(visit[i]==false)
{
for(int j=i;j<=n;j+=i)
{
if(visit[j]==false)
{
visit[j]=true;
ans+=i;
ci++;
}
}
}
if(ci==n)
break;
}
out.println(ans);
out.flush();
}
}
京公网安备 11010502036488号