Привет! Читаю книгу и тут, вообщем, после каждой главы - задания. Вообщем, вот какое.
Пользователь вводит числа через пробелы. Программа должна выводить:
Четные числа
Нечетные числа
Наибольшее число
Наименьшее число
Числа, которые делятся на 3 или на 9 (без остатка)
Числа, которые делятся на 5 и на 7 (без остатка)
Элементы, расположенные методом пузырька по убыванию модулей
Трехзначные числа, в записи которых нет повторяющихся цифр
Наибольший общий делитель
Наименьшее общее кратное
Простые числа
Числа, отсортированные по возрастанию
Числа, отсортированные по убыванию
Числа в порядке убывания частоты встречаемости
Хух. Вообщем, я все это написал, но мне кажется, уж слишком г#внокод. Требуется критика кода :) Представьте, что вы смотрите код на собеседовании.
public class Main
{
static Integer[] bubble;
public static void main(String[] args)
{
//setup
System.out.println("Введите числа через пробелы");
String[] arr = new Scanner(System.in).nextLine().split(" ");
ArrayList<Integer> ch = new ArrayList<>();
ArrayList<Integer> unch = new ArrayList<>();
ArrayList<Integer> ch39 = new ArrayList<>();
ArrayList<Integer> ch57 = new ArrayList<>();
ArrayList<Integer> z300 = new ArrayList<>();
ArrayList<Integer> primes = new ArrayList<>();
bubble = new Integer[arr.length];
int min = Integer.parseInt(arr[0]);
int lcm = Integer.parseInt(arr[0]);
int max = Integer.parseInt(arr[0]);
int nod = Integer.parseInt(arr[0]);
//logic
for (int x = 0; x < arr.length; x++)
{
String s = arr[x];
int i = Integer.parseInt(s);
bubble[x] = i;
min = Math.min(min, i);
max = Math.max(max, i);
if (Math.abs(i % 2) == 0) ch.add(i);
else unch.add(i);
if (i % 3 == 0 || i % 9 == 0) ch39.add(i);
if (i % 5 == 0 && i % 7 == 0) ch57.add(i);
if (s.length() == 3)
{
String a = s.substring(0, 1);
String b = s.substring(1, 2);
String c = s.substring(2, 3);
if (! a.equals(b) && ! b.equals(c) && ! c.equals(a))
{
z300.add(i);
}
}
nod = gcd(nod, i);
lcm = lcm(lcm, i);
int b;
int num;
for (b = min; b <= max; b++)
{
int counter = 0;
for(num = b; num >= 1; num--)
{
if(b % num==0)
{
counter = counter + 1;
}
}
if (counter == 2)
{
if(!primes.contains(b))
primes.add(b);
}
}
}
//unch
System.out.print("\nНечетные : ");
for (int unchitem : unch) System.out.print(unchitem + ", ");
//ch
System.out.print("\nЧетные : ");
for (int chitem : ch) System.out.print(chitem + ", ");
//ch39
System.out.print("\nДелятся на 3 или 9 : ");
for (int ch39item : ch39) System.out.print(ch39item + ", ");
//ch57
System.out.print("\nДелятся на 5 и 7 : ");
for (int ch57item : ch57) System.out.print(ch57item + ", ");
//z300
System.out.print("\nТрехзначные числа без повторяющихся цифр : ");
for (int z300item : z300) System.out.print(z300item + ", ");
sort();
System.out.print("\nПо возрастанию : ");
for (int upitem : bubble) System.out.print(upitem + ", ");
unsort();
System.out.print("\nПо убыванию : ");
for (int downitem : bubble) System.out.print(downitem + ", ");
bubbleSort();
System.out.print("\nПузырек : ");
for (int bubbleitem : bubble) System.out.print(bubbleitem + ", ");
final ArrayList<Integer> array = new ArrayList<>(Arrays.asList(bubble));
Collections.sort(array, new Comparator<Integer>() {
@Override
public int compare(Integer lhs, Integer rhs) {
int compareFreq = Collections.frequency(array, rhs) - Collections.frequency(array, lhs);
return compareFreq != 0 ?
compareFreq :
rhs - lhs;
}
});
System.out.print("\nЧисла в порядке убывания встречаемости : ");
for (int primesitem : array) System.out.print(primesitem + ", ");
System.out.print("\nПростые числа : ");
for (int primesitem : primes) System.out.print(primesitem + ", ");
//min & max & nod & nok
System.out.println("\nМинимальное число: " + min);
System.out.println("Максимальное число: " + max);
System.out.println("Наибольший общий делитель: " + nod);
System.out.println("Наименьшее общее кратное: " + lcm);
}
public static int gcd(int a, int b)
{
if (b == 0) return Math.abs(a);
return gcd(b, a % b);
}
public static int lcm(int a,int b){
return a / gcd(a,b) * b;
}
public static void bubbleSort()
{
for (int i=bubble.length - 1;i > 0;i--)
{
for (int j = 0;j < i;j++)
{
if (Math.abs(bubble[j]) <= Math.abs(bubble[j + 1]))
{
int tmp=bubble[j];
bubble[j] = Math.abs(bubble[j + 1]);
bubble[j + 1] = Math.abs(tmp);
}
}
}
}
public static void sort()
{
for (int i = bubble.length - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (bubble[j] >= bubble[j + 1])
{
int tmp = bubble[j];
bubble[j] = bubble[j + 1];
bubble[j + 1] = tmp;
}
}
}
}
public static void unsort()
{
for (int i = bubble.length - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (bubble[j] < bubble[j + 1])
{
int tmp=bubble[j];
bubble[j] = bubble[j + 1];
bubble[j + 1] = tmp;
}
}
}
}
UPD
Как мог упростил.
public class Main
{
public static ArrayList<Integer> nums;
public static void main(String[] args)
{
System.out.println("Введите числа через пробелы");
String[] arr = new Scanner(System.in).nextLine().split(" ");
nums = new ArrayList<>();
//перевод в Integer
for (String str : arr)
{
nums.add(Integer.parseInt(str));
}
//создаем списки
ArrayList<Integer> ch, unch, ch39, ch57, z300, primes;
ch = new ArrayList<>(); //для четных
unch = new ArrayList<>(); //для нечетных
ch39 = new ArrayList<>(); //для делимых на 3 или 9
ch57 = new ArrayList<>(); //для делимых на 5 и 7
z300 = new ArrayList<>(); //для трехзначных без повторений цифр
primes = new ArrayList<>(); //для простых
int first = nums.get(0);
int min = Collections.min(nums);
int max = Collections.max(nums);
int nod = first;
int lcm = first;
for (Integer i : nums)
{
String s = "" + i;
if (Math.abs(i % 2) == 0) ch.add(i);
else unch.add(i);
if (i % 3 == 0 || i % 9 == 0) ch39.add(i);
if (i % 5 == 0 && i % 7 == 0) ch57.add(i);
if (s.length() == 3)
{
String a = s.substring(0, 1);
String b = s.substring(1, 2);
String c = s.substring(2, 3);
if (! a.equals(b) && ! b.equals(c) && ! c.equals(a))
{
z300.add(i);
}
}
nod = nod(nod, i);
lcm = nok(lcm, i);
for(int r =2; r <= i/2; r++)
{
if(i % r != 0)
{
primes.add(i);
break;
}
}
}
output("Четные", ch);
output("Нечетные", unch);
output("Делятся на 3 или 9", ch39);
output("Делятся на 5 и 7", ch57);
output("Трехзначные числа без повторяющихся цифр", z300);
output("Простые числа", primes);
//сортируем по возрастанию
sort(false);
output("По убыванию", nums);
//переворачиваем список и получаем список по возрастанию
Collections.reverse(nums);
output("По возрастанию", nums);
//сортируем по частоте встречаемости
Collections.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer lhs, Integer rhs)
{
int compareFreq = Collections.frequency(nums, rhs) - Collections.frequency(nums, lhs);
return compareFreq != 0 ? compareFreq : rhs - lhs;
}
});
output("Числа в порядке убывания встречаемости", nums);
//сортируем по убыванию модулей
sort(true);
output("По убыванию модулей", nums);
System.out.println("\nМинимальное число: " + min);
System.out.println("Максимальное число: " + max);
System.out.println("Наибольший общий делитель: " + nod);
System.out.println("Наименьшее общее кратное: " + lcm);
}
public static int nod(int a, int b)
{
if (b == 0) return Math.abs(a);
return nod(b, a % b);
}
public static int nok(int a, int b)
{
return a / nod(a, b) * b;
}
public static void sort(boolean bubble)
{
if(bubble) {
for(int b = 0; b < nums.size(); b++)
nums.set(b, Math.abs(nums.get(b)));
}
Collections.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer lhs, Integer rhs)
{
if(rhs > lhs) return 1;
else if(rhs < lhs) return -1;
else return 0;
}
});
}
public static void output(String text, List<Integer> list){
System.out.print("\n" + text + " : ");
for (int i : list) System.out.print(i + ", ");
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Если я создам массив байт, например, и передам указатель на него в неуправляемый код, что с этим массивом будет делать Garbage Collector?
Доброго времени сутокВозникла такая проблема, что в eclipse всё время вылезает ошибка:
ИнтересноПочему рекурсия это плохо? Ведь это тот же самый цикл, даже более того, с возможностью передачи параметров
Как в пути (например, d:\\WrkFld\\JJJ\\Адреса или d:\WrkFld\JJJ\Адреса) определить количество обратных слешей (\\ или \)?