我最近参加了我学校的一个小型 Java 编程竞赛。我和我的搭档刚刚完成了我们的第一个纯 oop 课程,大多数问题都超出了我们的范围,所以我们解决了这个问题(我稍微解释一下):“给定一个输入整数 n,返回下一个整数和它的反面也是素数,例如如果 n = 18 你的程序应该打印 31" 因为 31 和 13 都是素数。然后,您的 .class 文件将有一个包含 1-2,000,000,000 的所有可能数字的测试用例,并且它必须在 10 秒内返回正确答案才能被视为有效。
我们找到了一个解决方案,但是对于更大的测试用例,它需要超过 10 秒。我相当肯定有一种方法可以将循环范围从 n,..2,000,000,000 向下移动,因为当 n 是一个低数字时需要循环那么远的可能性很小,但是无论哪种方式,当一个数字时我们都打破了循环在这两种情况下都是素数。起初我们从 2,..n 开始循环,不管它有多大,然后我想起了只循环到 n 的平方根的规则。关于如何使我的程序更高效的任何建议?我没有上课处理算法的复杂性分析。这是我们的尝试。
public class P3
{
public static void main(String[] args){
long loop = 2000000000;
long n = Integer.parseInt(args[0]);
for(long i = n; i<loop; i++)
{
String s = i +"";
String r = "";
for(int j = s.length()-1; j>=0; j--)
r = r + s.charAt(j);
if(prime(i) && prime(Long.parseLong(r)))
{
System.out.println(i);
break;
}
}
System.out.println("#");
}
public static boolean prime(long p){
for(int i = 2; i<(int)Math.sqrt(p); i++)
{
if(p%i==0)
return false;
}
return true;
}
}
ps 抱歉,如果我的代码格式错误,这是我第一次在这里发帖。此外,输出必须在每行之后有一个“#”,这就是循环之后的行的含义。感谢你们提供的任何帮助!!!