【发布时间】:2013-08-03 11:19:51
【问题描述】:
打印出小于给定数 N 的素数。对于加分,您的解决方案应该在 N*log(N) 时间或更短的时间内运行。你可以假设 N 总是一个正整数。
输入样本:
你的程序应该接受一个文件名的路径作为它的第一个参数。该文件中的每一行都是一个测试用例。每个测试用例将包含一个整数n < 4,294,967,295。
例如
10
20
100
输出样本:
对于输入的每一行,打印出小于 N 的素数,按升序排列,逗号分隔。 (逗号和数字之间不能有空格)例如
2,3,5,7
2,3,5,7,11,13,17,19
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
这是我的解决方案:
public class problem1 {
public static void main(String [] args) throws Exception
{
File f=new File("C://Users/Rahul/Documents/Projects/r.txt");
FileReader fr=new FileReader(f);
List<Integer> l=new ArrayList<>();
int p;
BufferedReader br = new BufferedReader(fr);
String s;
while( (s= br.readLine()) != null ) {
int a=Integer.parseInt(s);
for(int i=2;i<a;i++)
{
p=0;
for(int j=2;j<i;j++)
{
if(i%j==0)
p=1;
}
if(p==0)
l.add(i);
}
String st=l.toString();
st=st.replaceAll("\\[", "").replaceAll("\\]", "").replace(", ", ",");
System.out.print(st);
System.out.println("\t");
}
fr.close();
}
}
我的输入是:
10
50
输出是:
2,3,5,7
2,3,5,7,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47
但是当我提交这个解决方案时,他们不接受这个解决方案。
但是当我像这样将内容放入文档时:
10 50
30
我正在尝试那个java程序忽略这个50。怎么办?
还有更好的解决方案吗? 给我一些想法!
【问题讨论】:
-
我说的是复杂性。
-
你的方法是 N^2,而且是一个非常糟糕的 N^2。筛法效果很好。来自 CodeEval.com 的实际数字很小——大约为 1000。我的提交使用了 Sundaram 筛,运行时间为 0.03 秒。在 Java 中,我希望它更像 0.1 - 0.2,这仍然应该给出足够的分数。甚至我的 Java 版本也能快速计算多达 2000 万个,大部分时间都只是打印输出。
-
世界上谁会认为这属于Super User? (显然是 2 人)
标签: java algorithm data-structures time-complexity