package PrimeNum;
public class primeNum {
public static void main(String args[]){
int flag = 0;
/*
for(int i = 2; i <= 100; i++){
if(i % 2 != 0 && i % 3 != 0 && i % 4 != 0 && i % 5 != 0 &&
i % 6 != 0 && i % 7 != 0 && i % 8 != 0 && i % 9 != 0 && i % 10 != 0 ){
System.out.print(i + " ");
}
}
*/
System.out.println();
for(int i = 2; i <= 100; i++){
for(int j = 2; j <= 10; j++){
if(i % j != 0) {
flag++;
}
}
if(flag == 9 || flag == 8){
System.out.print(i + " ");
flag = 0;
}
}
}
}
代码是使用Java制作的,我似乎无法找到为什么它只在整个循环中打印2和3到100。请帮助吗?
答案 0 :(得分:1)
嗯,解释并不是那么困难(虽然我不知道为什么你写这个代码,但它肯定不是主要的测试)。
在你的内循环中,你测试当前的数字是否可以被数字2到10整除(你计算不分割i
的数字的数量)。
对于i=2
,只有2个除i
,因此在内循环之后,flag = 8
(3 .. 10
)。因此,您打印2
并重置flag
。
对于i=3
,只有3个除以i
,因此在内循环之后,flag = 8
(2
和4 .. 10
)。因此,您打印3
并重置flag
。
对于i=4
,2
和4
分为i
,因此在内循环之后flag = 7
。您不打印任何内容,不重置 flag
。
对于i=5
,只有5个除以i
。由于您未重置flag
,因此在内循环后它将为flag = 15
。您将永远不会重置flag
,因此您不再打印任何数字。
答案 1 :(得分:1)
这应该有效:
package PrimeNum;
public class primeNum {
public static void main(String args[]){
int flag = 0;
System.out.println();
for(int i = 2; i <= 100; i++){
flag = 0;//Initialize flag to 0 here
for(int j = 2; j <= 10; j++){
if(i % j != 0) {
flag++;
}
}
if(flag == 9 || flag == 8){
System.out.print(i + " ");
flag = 0;
}
}
}
}
找到素数的正确方法
public static void main(String[] args) {
int flag = 0;
for (int i = 2; i <= 100; i++) {
flag = 0;
for (int j = 2; j <= i - 1; j++) {
if (i % j != 0) {
flag++;
}
}
if (flag == i - 2) {
System.out.print(i + " ");
}
}
}
答案 2 :(得分:0)
这可能对您有所帮助
boolean isPrime=true;
for(int i = 2; i <= 100; i++){
for(int j=2; j<i; j++){
if(i%j == 0){
isPrime=false;
}
}
if(isPrime){
System.out.print(i+" ");
}
isPrime=true;
}
Out put
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
答案 3 :(得分:0)
怎么样:
public static void main(String args[]){
System.out.println();
for(int i = 2; i <= 100; i++){
int flag = 0;
for(int j = 2; j <= i; j++){
if(i % j == 0) {
flag++;
}
}
if(flag == 1){
System.out.print(i + " ");
}
}
}
返回:
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
答案 4 :(得分:0)
你想测试每个数字,计算除数的数字并在该数量与critera匹配时打印它是好的,但我会稍稍颠倒测试。
素数只有两个正除数,1和数字本身
如果你测试2和数字1之间的每个数字,你应该找到正好0个除数。对于每个数字都是如此,你不必知道有多少除数不是除数而你不必测试每个数上的每个除数,25不能为10除数因为它更大。
public static void simplePrintPrimesUpTo(int max) {
// test every number between 2 and max inclusive
for (int number = 2; number <= max; number++) {
int foundDivisors = 0;
// test every divisor between 2 and 1 less than the current number
for (int divisor = 2; divisor < number; divisor++) {
if (number % divisor == 0) {
foundDivisors++;
}
}
if (foundDivisors == 0)
System.out.print(number + " ");
}
System.out.println();
}
这可以进一步优化。除数的一个有趣特性是
n的除数必须小于或等于n的平方根
这意味着在内循环中使用divisor <= sqrt(number)
作为上限会大大减少所需的测试量。不幸的是,计算on int的平方根很难看,但是这个公式可以在两边平方,测试变得更简单。
(divisor)^2 <= (sqrt(number))^2
可以简化为
(divisor)^2 <= number
可以做的下一个优化是跳过测试除数(如果找到了除数)。如果有2个或10个没关系,如果我们找到了它就没有素数。结果可能如下所示
public static void optimizedPrintPrimesUpTo(int max) {
nextNumber:
for (int number = 2; number <= max; number++) {
for (int divisor = 2; (divisor * divisor) <= number; divisor++) {
if (number % divisor == 0) {
// skip testing this number, continue in the outer loop
continue nextNumber;
}
}
System.out.print(number + " ");
}
System.out.println();
}