前段时间我遇到了类似这样的问题:
幸运数字是一个数字,其前面的数字(包括其自身)的总和是素数。例如,两个是幸运数字,因为它变为1 + 2.由于这是3,而3是素数,我们可以得出结论,2是幸运数字。
我尝试构建一个简单的代码来查找一些幸运数字
public static void main(String args[]) {
boolean isPrime = true;
for(int x = 3; x < 1000; x++) {
int num = ( (x * (x + 1)) / 2);
// formula for checking the sum of integers one through x
for(int i = 2; i < num; i++) {
if(num % i == 0) {
isPrime = false;
// if it's false it is not prime
}
if(isPrime == true) {
System.out.println(x);
// prints out the original number, the sum of the numbers before it is a prime number
}
}
}
}
换句话说,它应该取一个数字x,将其插入公式中,看看公式返回的数字是否为素数。但是,我得到了很长一段不是素数的数字(比如3,4,5,6,7 ......)。
答案 0 :(得分:4)
从1到x的整数之和为x *(x + 1)/ 2。
x 或 x + 1是偶数,因此总和总是 2个整数的乘积 - x *((x + 1)/ 2) 或(x / 2)*(x + 1)。
素数不能作为两个整数的乘积,除非那两个整数是1和它本身,所以,如果x是“幸运的”,那么(x + 1)/ 2 == 1 或 x / 2 == 1 或 x + 1 == 1 或 x == 1,即x为0,1或2.
因为0不算......
1和2是唯一的幸运数字
答案 1 :(得分:1)
只是一个小小的逻辑问题。当它是一个素数时你应该打印一个素数。这意味着它不会除以所有这些数字。所以把它移到循环之外。
for(int x = 3; x < 1000; x++) {
int num = ( (x * (x + 1)) / 2);
// formula for checking the sum of integers one through x
if (num%2 == 0) {
isPrime = false;
}
for(int i = 3; isPrime && i < num ; i += 2) {
if(num % i == 0) {
isPrime = false;
// if it's false it is not prime
}
}
if(isPrime == true) {
System.out.println(x);
// prints out the original number, the sum of the numbers before it is a prime number
}
}
我还添加了一些优化 - 不需要检查n%4,n%6 itd是否为0,当检查是否已经找到一个除数时检查是否除以大数字时也是如此。
另一方面,x > 2
是不可能的。 唯一适用的x
是2
。
答案 2 :(得分:0)
在你的内部for循环的每一步,你都在检查它是否是素数。因为它默认为素数,如果在第一次检查中没有找到它,则显示。
public static void main(String args[]) {
boolean isPrime = true;
for (int x = 3; x < 1000; x++) {
int num = ((x * (x + 1)) / 2);
// formula for checking the sum of integers one through x
for (int i = 2; i < num; i++) {
if (num % i == 0) {
isPrime = false;
// if it's false it is not prime
}
}
if (isPrime == true) {
System.out.println(x);
// prints out the original number, the sum of the numbers before it is a prime number
}
}
答案 3 :(得分:0)
这是不可能的。但这是我使用流的解决方案!!
double