如何为 Prime Checker [Java] 允许更多条目和 return 因素?
How to allow more entry and return factors for Prime Checker [Java]?
我着手编写素数检查器:
import java.util.Scanner;
public class PrimeChecker {
int userEntry;
int even_check;
int odd_check;
final void run(String[] args)
{
Scanner jaiho = new Scanner(System.in);
System.out.printf("Please enter a prime number: %n");
userEntry = jaiho.nextInt();
even_check = userEntry % 2; // This is to get remainders
odd_check = userEntry % 3; // If its not a multiple a remainder tells us that.
System.out.println("Even Check is: " + even_check);
System.out.println("Odd Check is: " + odd_check);
if (even_check > 0 && odd_check > 0)
{
System.out.printf("This number is a prime number! Hoorah!");
}
else if (userEntry == 2 || userEntry == 3)
{
System.out.printf("This number is a prime number! Hoorah!");
}
else
{
System.out.printf("This number is not a prime number.");
}
}
}
基本流程:
用户输入号码。
系统检查并打印回 "it is prime" 或 "No it isn't prime"。到目前为止它是有效的,但我还没有尝试破解它。
1) 如何允许一次输入更多号码并查看?例如,用户输入“3,6,89,13”,系统 returns "prime, not prime, prime, prime"
2) return 因素的功能。我想保持简单 return 2 或 3 作为因素。例如,用户输入“32”,系统 returns "This number is not prime. 2 is a factor."
我不一定想要完整的答案,但我确实想要一些提示和一些代码。
--------------------------------JP回答后---------- ----------------------
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PrimeChecker {
String primeOrNot = "(";
final void run(String[] args)
{
Scanner jaiho = new Scanner(System.in);
System.out.printf("Please enter a prime number: %n");
String userEntry = jaiho.next();
Pattern p=Pattern.compile("\((\d)+(?:,(\d+))*\)");
Matcher m = p.matcher(userEntry);
if (m.matches())
{
for (int a = 0; a < m.groupCount(); a++)
{
String d = m.group(a+1);
int i = Integer.parseInt(d);
int even_check = i % 2; // This is to get remainders
int odd_check = i % 3; // If its not a multiple a remainder tells us that.
System.out.println("Even Check is: " + even_check);
System.out.println("Odd Check is: " + odd_check);
if (even_check > 0 && odd_check > 0)
{
primeOrNot += "prime, ";
}
else if (i == 2 || i == 3)
{
primeOrNot += "prime, ";
}
else if (even_check == 0 || odd_check ==0)
{
primeOrNot += "not a prime, ";
}
else
{
primeOrNot += "not a prime, ";
}
}
primeOrNot += ")";
System.out.println(primeOrNot);
}
}
}
你首先需要解析你想要的字符串例如(3,6,86,13)。对于这个问题,你可以使用正则表达式(现在你有两个问题(-:)。见http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html。
您的正则表达式需要解析一个括号,后面跟着一些数字,然后可能是一个逗号和更多的数字多次,然后是一个结束逗号。表达式为:
Pattern p=Pattern.compile("\((\d)+(?:,(\d+))*\)");
您需要对括号进行转义,并且您需要说明您不希望从评估模式得到的结果中使用逗号,因此使用 ?:。
但这行不通,因为它不会捕获第一个逗号后的重复数字,只会捕获最后一个逗号(参见 Java regex: Repeating capturing groups)。所以你必须先解析parens和第一个数字,然后重复解析逗号和后面的数字。
// search for parens + digits
Pattern p=Pattern.compile("\((\d+)");
Matcher m=p.matcher(userEntry);
// where to search from in the string
int st=0;
while (m.find(st)) {
String d = m.group(1);
// get new start index
st=m.end();
int i = Integer.parseInt(d);
int even_check = i % 2; // This is to get remainders
// prime checks
...
// now we need to search for comma + digits
p=Pattern.compile(",(\d+)");
m=p.matcher(userEntry);
}
primeOrNot += ")";
System.out.println(primeOrNot);
从那时起,对于每个匹配组,您可以将因素保存在一个列表中,并在最后打印所有内容...
希望对您有所帮助!
我着手编写素数检查器:
import java.util.Scanner;
public class PrimeChecker {
int userEntry;
int even_check;
int odd_check;
final void run(String[] args)
{
Scanner jaiho = new Scanner(System.in);
System.out.printf("Please enter a prime number: %n");
userEntry = jaiho.nextInt();
even_check = userEntry % 2; // This is to get remainders
odd_check = userEntry % 3; // If its not a multiple a remainder tells us that.
System.out.println("Even Check is: " + even_check);
System.out.println("Odd Check is: " + odd_check);
if (even_check > 0 && odd_check > 0)
{
System.out.printf("This number is a prime number! Hoorah!");
}
else if (userEntry == 2 || userEntry == 3)
{
System.out.printf("This number is a prime number! Hoorah!");
}
else
{
System.out.printf("This number is not a prime number.");
}
}
}
基本流程: 用户输入号码。 系统检查并打印回 "it is prime" 或 "No it isn't prime"。到目前为止它是有效的,但我还没有尝试破解它。
1) 如何允许一次输入更多号码并查看?例如,用户输入“3,6,89,13”,系统 returns "prime, not prime, prime, prime"
2) return 因素的功能。我想保持简单 return 2 或 3 作为因素。例如,用户输入“32”,系统 returns "This number is not prime. 2 is a factor."
我不一定想要完整的答案,但我确实想要一些提示和一些代码。
--------------------------------JP回答后---------- ----------------------
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PrimeChecker {
String primeOrNot = "(";
final void run(String[] args)
{
Scanner jaiho = new Scanner(System.in);
System.out.printf("Please enter a prime number: %n");
String userEntry = jaiho.next();
Pattern p=Pattern.compile("\((\d)+(?:,(\d+))*\)");
Matcher m = p.matcher(userEntry);
if (m.matches())
{
for (int a = 0; a < m.groupCount(); a++)
{
String d = m.group(a+1);
int i = Integer.parseInt(d);
int even_check = i % 2; // This is to get remainders
int odd_check = i % 3; // If its not a multiple a remainder tells us that.
System.out.println("Even Check is: " + even_check);
System.out.println("Odd Check is: " + odd_check);
if (even_check > 0 && odd_check > 0)
{
primeOrNot += "prime, ";
}
else if (i == 2 || i == 3)
{
primeOrNot += "prime, ";
}
else if (even_check == 0 || odd_check ==0)
{
primeOrNot += "not a prime, ";
}
else
{
primeOrNot += "not a prime, ";
}
}
primeOrNot += ")";
System.out.println(primeOrNot);
}
}
}
你首先需要解析你想要的字符串例如(3,6,86,13)。对于这个问题,你可以使用正则表达式(现在你有两个问题(-:)。见http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html。 您的正则表达式需要解析一个括号,后面跟着一些数字,然后可能是一个逗号和更多的数字多次,然后是一个结束逗号。表达式为:
Pattern p=Pattern.compile("\((\d)+(?:,(\d+))*\)");
您需要对括号进行转义,并且您需要说明您不希望从评估模式得到的结果中使用逗号,因此使用 ?:。 但这行不通,因为它不会捕获第一个逗号后的重复数字,只会捕获最后一个逗号(参见 Java regex: Repeating capturing groups)。所以你必须先解析parens和第一个数字,然后重复解析逗号和后面的数字。
// search for parens + digits
Pattern p=Pattern.compile("\((\d+)");
Matcher m=p.matcher(userEntry);
// where to search from in the string
int st=0;
while (m.find(st)) {
String d = m.group(1);
// get new start index
st=m.end();
int i = Integer.parseInt(d);
int even_check = i % 2; // This is to get remainders
// prime checks
...
// now we need to search for comma + digits
p=Pattern.compile(",(\d+)");
m=p.matcher(userEntry);
}
primeOrNot += ")";
System.out.println(primeOrNot);
从那时起,对于每个匹配组,您可以将因素保存在一个列表中,并在最后打印所有内容...
希望对您有所帮助!