[英]Printing prime numbers between 100 to 1000 whose digit sum equals to 19
我有这个问题。 我已经编写了相同的代码,但我无法找到我做错的地方。 它打印 100 为 output 没有别的。
package practicepkg;
import java.util.Scanner;
public class PrimeNumber {
public static void main(String[] args) {
System.out.println("Enter the number to check");
Scanner in = new Scanner(System.in);
//taking input for 1000
int number = in.nextInt();
int count=0;
int k,num=100,sum=0;
//running loop from 100 to till user input(1000)
for(k=100;k<=number;k++)
{
//loop for checking prime number
for(int i=2;i<(int)(Math.sqrt(number));i++)
{
if(k%i==0)
{
count+=1;
}
//here only taking prime numbers
if(count==0)
{
num=k;
//using while loop to calculate sum
while(num!=0)
{
sum=sum+num%10;
num=num/10;
}
//comparing and printing the actual prime number value for k
if(sum==19)
System.out.println(k);
}
//resetting the count value to zero for next iteration
count=0;
}
}
}
}
使用基本的蛮力方法,每个素数的总和应重置为 0,我们需要在完成检查数字是否为素数后计算总和。
public static void main(String[] args) {
System.out.println("Enter the number to check");
Scanner in = new Scanner(System.in);
//taking input for 1000
int number = in.nextInt();
int count=0;
int k,num=100,sum=0;
//running loop from 100 to till user input(1000)
for(k=100;k<=number;k++)
{
//loop for checking prime number
for(int i=2;i<(int)(Math.sqrt(number));i++)
{
if(k%i==0)
{
count+=1;
}
}
//This should be outside the loop that checks the number for prime
if(count==0)
{
//Sum should be reset for each new prime number
sum=0;
num=k;
//using while loop to calculate sum
while(num!=0)
{
sum=sum+num%10;
num=num/10;
}
//comparing and printing the actual prime number value for k
if(sum==19)
System.out.println(k);
}
//resetting the count value to zero for next iteration
count=0;
}
}
编辑:上述问题的最佳解决方案。 感谢@D George 指出
public static void main(String[] args) {
System.out.println("Enter the number to check");
Scanner in = new Scanner(System.in);
//taking input for 1000
int number = in.nextInt();
boolean flag = false;
int k,num=100,sum=0;
//running loop from 100 to till user input(1000)
for(k=100;k<=number;k++)
{
//resetting the flag value to false for next iteration
flag = false;
//loop for checking prime number
for(int i=2;i<(int)(Math.sqrt(number));i++)
{
if(k%i==0)
{
flag=true;
break;
}
}
//This should be outside the loop that checks the number for prime
if(!flag)
{
//Sum should be reset for each new prime number
sum = 0;
num = k;
//using while loop to calculate sum
while(num!=0)
{
sum += num%10;
num /= 10;
}
//comparing and printing the actual prime number value for k
if(sum==19) {
System.out.println(k);
}
}
}
}
您正在查看 100 到 1000 之间的数字。在该范围内,所有以偶数结尾或以 5 结尾的数字都不是质数,因此您甚至无需费心检查它们。 在该范围内,质数只能以 1、3、7 或 9 结尾。
这为您提供了伪代码,例如:
for (base <- 100; base < 1000; step 10)
test(base + 1)
test(base + 3)
test(base + 7)
test(base + 9)
endfor
这可以通过在素数测试之前检查base
的数字和来进一步细化。 您只需要进一步检查base
之和是 (19 - 1)、(19 - 3)、(19 - 7) 或 (19 - 9) 之一的位置。 这意味着您可以遍历 100 到 1000 的范围,只查看每十个数字,计算其数字总和,并检查后面十个数字中的一个潜在质数或一个潜在质数。
您可以通过注意数字和为 19 的最小三位数是 199 来节省更多时间,因此您可以从base
而不是 100 开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.