#java
#java
Вопрос:
public class Palindrome
{
public static void main ( String [] args )
{
Scanner scan = new Scanner ( System.in ) ; // new object named "scan"
System.out.println ( "nPlease enter a number: " ) ;
int num = scan.nextInt () ; //store number into num
if ( ( (num /1000)==(num%10) )
amp;amp; ( ( (num/10) %10 ) == ( (num/100)%10 ) ) )
// num = 'abcd' : if (a=d) and (b=c) number is a palindrome.
System.out.println ( "nIs a Palindrome !" ) ;
else
System.out.println ( "nNot a Palindrome !" ) ;
} //end of method main
} //end of class Palindrome
- Есть ли способ оптимизировать этот код?
Мне нужно иметь дело только с 4-значным числом! - Как мне добавить проверку того, что число действительно является положительным числом и состоит из 4 цифр?
Комментарии:
1. Вы не знаете, как проверить, является ли
int
положительным числом?2. Спасибо за упражнение. Но.. что вы пробовали? Каковы ваши первые предположения, какую конкретную помощь мы можем предложить? SO — это не сайт «Делай мою домашнюю работу».
3. Вы также можете преобразовать свое число в
String
и выполнить проверку символов на палиндроме. (Или, в первую очередь, оставьте ввод от пользователя в качествеString
.)4. что за ужасающее использование магических чисел? просто проверьте, что обратная сторона строки совпадает с исходной…
5. Вы можете избавиться от всех дополнительных операций с модулем
Ответ №1:
Разделите задачу на более мелкие, более управляемые части, которые вы можете решить. Например:
Чтобы проверить, имеет ли строка длину 4:
static boolean is4Digit(String p) {
return p.length()==4;
}
Чтобы проверить, находится ли число между 2 числами:
static boolean isBetween(int nr, int low, int hi) {
return nr>low amp;amp; nr<hi;
}
Чтобы проверить, является ли string палиндромом:
static boolean isPalindrome(String p) {
return p.equals(new StringBuilder(p).reverse().toString());
}
Комментарии:
1. System.out.println не входит в класс Scanner
Ответ №2:
Как мне добавить проверку того, что число действительно является: во-первых, положительным числом, а во-вторых, 4-значным числом?
Я мог бы интерпретировать 4-значное неотрицательное целое число двумя способами.
0 <= n amp;amp; n <= 9999
или
1000 <= n amp;amp; n <= 9999
Для оптимизации я бы не стал утруждать себя синтаксическим анализом из строки:
BufferedReader bufferedInput = new BufferedReader(System.in);
String line = bufferedInput.readLine();
if (line == null) { /* handle end of input case */ }
String number = line.trim();
// Check if its a palindrome
if (number.length() == 4
amp;amp; number.charAt(0) == number.charAt(3)
amp;amp; number.charAt(1) == number.charAt(2)) {
// Finally check that the characters are all digits
boolean isLegal = true;
for (int i = (number.length() 1) / 2; --i >= 0;) {
char shouldBeADigit = number.charAt(i);
if (!('0' <= shouldBeADigit amp;amp; shouldBeADigit <= '9')) {
isLegal = false;
break;
}
}
if (isLegal) {
System.out.println(number " is a palindrome");
}
}
Комментарии:
1. Если вы сначала выполняете проверку палиндрома, то вам нужно проверить только первые n / 2 символа (n / 2 1, если длина нечетная), поскольку по определению палиндрома остальные также должны быть цифрами.
2. Нельзя проверять только 1000 <= num amp;amp; num <= 9999, потому что, если пользователь введет: 1200.89, что произойдет сейчас?
3. @Mosh, который вы используете
int
, вы хотите использоватьdouble
4. @M. Jessup, совершенно верно, но если его длина нечетная, я думаю, вам нужно только проверить (n / 2 — 1), поскольку средняя всегда равна самой себе.
5. @Mike, тебе все равно нужно проверить середину, поскольку ты проверяешь, является ли это цифрой. т. Е. если твой тест на палиндром верен (при условии, что он не зависит от буквенных обозначений) и ты не проверяешь середину, строка «123Z321» будет считаться действительной. (Все это основано на тестировании палиндрома, не подтверждающем число). Однако для проверки только палиндрома, я согласен, достаточно n / 2 (я думаю, у вас была опечатка с n / 2 -1, например, n = 7, n / 2 = 3 с целочисленным делением, четвертый символ не имеет значения). Это то, что я сделал в моем примере решения ниже (хотя это может быть не совсем очевидно, оно проверяет только n / 2).
Ответ №3:
Более читаемым способом было бы это:
Scanner scan = new Scanner ( System.in ) ; // new object named "scan"
System.out.println ( "nPlease enter a number: " ) ;
int num = scan.nextInt () ; //store number into num
if(num<0 || num>9999)
System.out.println("Only positive numbers with 4 digits are accepted.");
else {
int help=num;
int rev=0;
while (help > 0) {
rev = rev * 10 help %10;
help = help / 10;
}
System.out.println("Is a palindrome: " (rev==num));
}
Ответ №4:
Чтобы проверить, где вводится число
public static boolean isNumeric(String str)
{
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(str, pos);
return str.length() == pos.getIndex();
}
Ответ №5:
Чисто математическая реализация isPalindrome (без преобразования строк), которая несколько более эффективна, чем у Криса (хотя, конечно, еще менее интуитивно понятна / читабельна):
public static boolean isPalindrome(int number) {
if(number < 0){
throw new IllegalArgumentException("number must be positive!");
}
int powerOf10 = (int)Math.pow(10, (int)Math.floor(Math.log10(number)));
while(powerOf10 >= 10) {
number -= powerOf10 * (number % 10);
if(number < 0 || number >= powerOf10) {
return false;
}
number /= 10;
powerOf10 /= 100;
}
return true;
}
Поскольку это вопрос домашнего задания, я оставлю объяснение того, почему это работает, в качестве упражнения для читателя.
Ответ №6:
Вы также могли бы сделать это, используя регулярное выражение с группами захвата и обратными ссылками. Рассмотрите это регулярное выражение для записи двух цифр, а затем запишите еще две цифры, равные первым двум, в обратном порядке:
private static String PALINDROME = "(\d)(\d)(?:\2)(?:\1)";
public boolean isPalindrome(String testStr) throws NoMatchFoundException {
Pattern pattern = Pattern.compile(PALINDROME);
Matcher matcher = pattern.matcher(testStr);
return matcher.matches();
}