定义visit[i]数组用于记录i是否已经被用过了
然后用i从2遍历到n遍历
如果i没有被当做质因子用过的话
我们就从i开始,将i的倍数全部标记一下,同时ans每一次都要去加上i,注意不是加i的倍数,而是去加质因子i。
这里特别声明一下java选手不能去用j=ii,因为java的下标只能是int类型,j=ii会爆掉int的。
所以只能牺牲速度去做这道题 不过还好可以过。当然你也可以去选择转为列表再用j=ii;
这里说明一下为什么要从j=i
i开始而不是我写的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();
    }
                  }