public class Lab5{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Please enter N: ");
int n = input.nextInt();
System.out.println("The palindrome prime numbers less than " + n + " are: ");
for (int x=2; x<n; x++){
if(isPrime(x) && isPalindrome(x)){
System.out.print(x+", ");
}
}
}
public static boolean isPrime(int x){
for (int i=2; i<x; i++){
if (x%i ==0)
return false;
}return true;
}
public static int reverse(int x){
int ans=0;
while (x != 0){
ans = ans*10 + x%10;
x=x/10;
}return ans;
}
public static boolean isPalindrome(int x){
if (x%reverse(x) ==0)
return true;
else return false;
}
}
每当我输入大数字为N,即1,000,000时,我的程序进入无限循环。我需要帮助在截止日期前修复它10个小时。任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
它不会进入无限循环,只会变得越来越慢。
对于mor反馈,你可以使用System.out.flush()
让它更慢一些。这会导致显示内部缓冲线。
System.out.print(x+", ");
System.out.flush();
现在,isPalindrome
对我的理解应该只是:
return x == reversed(x);
关于速度:
if(isPrime(x) && isPalindrome(x)){
应该是
if (isPalindrome(x) && isPrime(x)) {
原因:isPalindrome将迅速变得比isPrime快得多。当左侧是假的时,&&
不会评估右侧。而且还有比素数更少的回文。
小事:
x=x/10;
可以写
x /= 10;
也许
int sqr = (int)Math.sqrt(x);
if (2 <= sqr) {
if (x % 2 == 0)
return false;
}
for (int i = 3; i <= sqr; i += 2) {
if (x % i == 0)
return false;
}
return true;
答案 1 :(得分:0)
这是代码。确保下次发布时列出您所做的所有尝试。这会给这里的人留下一个印象,就是你尝试了一些东西,而不仅仅是抛弃它。
public class Lab5{
public static void main(String[] args){
// Scanner input = new Scanner(System.in);
// System.out.print("Please enter N: ");
// int n = input.nextInt();
int n = 1000000;
long startTime = System.currentTimeMillis();
System.out.println("The palindrome prime numbers less than " + n + " are: ");
for (int x=2; x<n; x++){
if(isPrime(x) && isPalindrome(x)){
System.out.print(x+", ");
}
}
long endTime = System.currentTimeMillis();
System.out.println("the elapsed time is " + (endTime - startTime) + " milliseconds.");
}
public static boolean isPrime(int x){
for (int i=2; i<Math.sqrt(x); i++){
if (x%i ==0)
return false;
}return true;
}
public static int reverse(int x){
int ans=0;
while (x != 0){
ans = ans*10 + x%10;
x=x/10;
}return ans;
}
public static boolean isPalindrome(int x){
if (x%reverse(x) ==0)
return true;
else return false;
}
}
Ans输出是,
/home/ubuntu/workspace/New Folder (master) $ java Lab5
The palindrome prime numbers less than 1000000 are:
2, 3, 4, 5, 7, 9, 11, 101, 121, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929, 10201, 10301, 10501, 10601, 11311, 11411, 12421, 12721, 12821, 13331, 13831, 13931, 14341, 14741, 15451, 15551, 16061, 16361, 16561, 16661, 17471, 17971, 18181, 18481, 19391, 19891, 19991, 30103, 30203, 30403, 30703, 30803, 31013, 31513, 32323, 32423, 33533, 34543, 34843, 35053, 35153, 35353, 35753, 36263, 36563, 37273, 37573, 38083, 38183, 38783, 39293, 70207, 70507, 70607, 71317, 71917, 72227, 72727, 73037, 73237, 73637, 74047, 74747, 75557, 76367, 76667, 77377, 77477, 77977, 78487, 78787, 78887, 79397, 79697, 79997, 90709, 91019, 93139, 93239, 93739, 94049, 94249, 94349, 94649, 94849, 94949, 95959, 96269, 96469, 96769, 97379, 97579, 97879, 98389, 98689,
**the elapsed time is 488 milliseconds.**
答案 2 :(得分:0)
我不认为这是一个infinte循环。它只是花时间检查素数。一个快速的提示是改变if条件将更快结果的顺序。尝试使用if (isPalindrome(x) && isPrime(x))
而不是if(isPrime(x) && isPalindrome(x))
。计算素数比检查回文需要更多的迭代。
其次,回文检查逻辑是错误的。 x%reverse(x) == 0
永远不会给回文。比如说100.反向是001.然后100%001 == 0.这不是回文。将其更改为x == reverse(x)