定义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(); } }