Первую задачу, как я уже сказал я разбил на два метода.
Первый метод определяет простое число или нет. Для тех кто еще не читает код на ява, в двух словах идея алгоритма:
Делаем предположение, что число простое. Условие продолжения цикла, что число простое и меньше корня из тестируемого числа (больше проверять смысла нет). В переменную в которой хранится предположение записываем результат сравнения остатка от деления с нулем. Если не равно нулю - число пока не составное, если равно - флаг опускается тем самым прерывая выполнения цикла. Действительно, поняв что число 18 делится на 2, зачем его делить на 3, 4... Второй метод интереса не представляет.
Код:
public static boolean isSimple(int i) {
boolean simple = true;
int sqrI = (int)Math.sqrt(i);
int iterator = 2;
while (simple && iterator <= sqrI)
{
simple = i % iterator != 0;
iterator++;
}
return simple;
}
public static void PrintSimple(int forNumber)
{
for (int i = 1; i <= forNumber; i++)
{
if (isSimple(i))
{
System.out.println(i);
}
}
}
* This source code was highlighted with Source Code Highlighter.
Вторая задача, как я уже говорил поинтереснее, если решать при помощи календаря, то будет скучно. Идея простая записываем числа в календарь, смотрим то что хранится в календаре поэлементно с тем, что введено. Если совпало - даты правильные. Скучно...
Решал так. сначала писал метод с двумя параметрами, делая допущение что год не високосный. Проверяем правильность введенного месяца, а потом смотрим сколько дней максимум в том месяце который проверяем. Т.к. месяцев с 31 днем больше чем других, это предположение идет первым. Затем проверяем месяц с 28 днями и месяца с 30 днями (их всего 4 против 7 месяцев с 31 днем).
public static boolean checkDate(final int month, final int date) {
boolean normalDate = true;
if (month < 1 || month > 12)
{
normalDate = false;
}
else
{
if (date < 1)
{
normalDate = false;
}
else
{
int maxDate = 31;
switch (month)
{
case (2):
maxDate = 28;
break;
case (4):
case (6):
case (9):
case (11):
maxDate = 30;
break;
}
if (date > maxDate)
{
normalDate = false;
}
}
}
return normalDate;
}
* This source code was highlighted with Source Code Highlighter.
Ну и собственно второй метод вызывает первый (помните мы делали предположение что год не високосный), и вносит правку в случае февраля високосного года. public static boolean checkDate(final int year, final int month, final int date) {
boolean normalDate = checkDate(month, date);
if (year < 1970)
{
normalDate = false;
}
else
{
if (month == 2 && year % 4 == 0 && (year % 100 > 1 || year % 400 == 0) && date < 30 && date > 0)
{
normalDate = true;
}
}
return normalDate;
}
* This source code was highlighted with Source Code Highlighter.
Ну и третья задача. Первый метод тривиальный, и единственная особенность проверить что индекс заменяемого символа существует: public static String setCharAt(final String source, final char symbol, final int position) throws IllegalArgumentException {
String result = source;
if (position >= 0 && position < source.length())
{
result = source.substring(0, position) + symbol + source.substring(position + 1, source.length());
}
return result;
}
* This source code was highlighted with Source Code Highlighter.
Вторая задача чуть поинтереснее, да и то в случае, если подумать о производительности (строки это медленный тип). Поэтому строка в массив, инверсия, массив в строку. public static String reverse(final String source) {
char[] buffer = source.toCharArray();
int midlePosition = buffer.length / 2;
for (int i = 0; i < midlePosition; i++) {
char temp = buffer[i];
buffer[i] = buffer[buffer.length - i - 1];
buffer[buffer.length - i - 1] = temp;
}
return String.copyValueOf(buffer);
}
* This source code was highlighted with Source Code Highlighter.
На этом все. Приятного времяпровождения за изучением забавного языка Java.P.s. Кстати кто знает как в эклипсе дебагером воспользоваться?
Комментариев нет:
Отправить комментарий