powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачи на числа. Решение. Покритикуйте. (часть #1)
25 сообщений из 117, страница 4 из 5
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709294
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Denis_m1st,
Извини брат, этот топик уже не твой. По теме тебе всё сказали. Дай людям отдохнуть.
ROFL
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37712728
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz6. Русскоязычный текст может потерятся в процессе компиляции. Что лучше сделать чтобы не потерялся?

Сделал рефактор кода - в соответствии с почти всеми Вашими советами. Зацените спойлер :


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
package chapt01.b;

import java.util.*;
import java.util.Map.Entry;

import static java.util.Collections.*;

/**
 * @author m1st
 */

// TODO translate rus to eng

public class OperationsWithNumbers2 {
	private static void findEvenAndOddNumbers(Integer[] sourceNumbers) {
		List<Integer> evens = new ArrayList<Integer>();
		List<Integer> odds = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber % 2 == 0) {
				evens.add(sourceNumber);
			} else {
				odds.add(sourceNumber);
			}
		}
		System.out.println("Чётные числа: " + evens);
		System.out.println("Нечётные числа: " + odds);
	}

	private static void findMaxAndMinNumbers(Integer[] sourceNumbers) {
		List<Integer> numbers = Arrays.asList(sourceNumbers);
		System.out.println("Наибольшее число: " + max(numbers));
		System.out.println("Наименьшее число: " + min(numbers));
	}

	private static void findModNumbers(int divider, Integer[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider + ": ");
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber % divider == 0) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	private static void sortNumbersWithBubbleReverseByAbs(
			Integer[] sourceNumbers) {
		Integer[] result = sourceNumbers.clone();
		boolean swapped = true;
		int j = 0;
		int temp;
		while (swapped) {
			swapped = false;
			j++;
			for (int i = 0; i < result.length - j; i++) {
				if (Math.abs(result[i]) < Math.abs(result[i + 1])) {
					temp = result[i];
					result[i] = result[i + 1];
					result[i + 1] = temp;
					swapped = true;
				}
			}
		}
		System.out.println("Элементы, расположенные методом пузырька "
				+ "по убыванию модулей: " + Arrays.asList(result));
	}

	private static void findNumbersWithThreeDifferentDigits(
			Integer[] sourceNumbers) {
		String number;
		List<Integer> result = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			number = sourceNumber.toString();
			if (number.length() == 3 && number.charAt(0) != number.charAt(1)
					&& number.charAt(1) != number.charAt(2)
					&& number.charAt(0) != number.charAt(2)) {
				result.add(sourceNumber);
			}
		}
		System.out.println("Все трехзначные числа, "
				+ "в десятичной записи которых нет одинаковых цифр: " + result);
	}

	private static long findGreatestCommonDivisor(long a, long b) {
		while (b > 0) {
			long temp = b;
			b = a % b;
			a = temp;
		}
		return a;
	}

	private static void findGreatestCommonDivisor(Integer[] sourceNumbers) {
		long result = sourceNumbers[0];
		for (int i = 1; i < sourceNumbers.length; i++) {
			result = findGreatestCommonDivisor(result, sourceNumbers[i]);
		}
		System.out.println("Наибольший общий делитель: " + result);
	}

	private static long findLeastCommonMultiple(long a, long b) {
		return a * (b / findGreatestCommonDivisor(a, b));
	}

	private static void findLeastCommonMultiple(Integer[] sourceNumbers) {
		long result = sourceNumbers[0];
		for (int i = 1; i < sourceNumbers.length; i++) {
			if ((sourceNumbers[i] == 0 || sourceNumbers[0] == 0)
					|| (sourceNumbers[i] < 0 || sourceNumbers[0] < 0)) {
				break;
			}
			result = findLeastCommonMultiple(result, sourceNumbers[i]);
		}
		System.out.println("Наименьшее общее кратное: " + result);
	}

	public static boolean isPrimeNumber(int n) {
		boolean prime = true;
		for (long i = 3; i <= Math.sqrt(n); i += 2) {
			if (n <= 1)
				return false;
			if (n == 2)
				return true;
			if (n % i == 0) {
				prime = false;
				break;
			}
		}
		return (n % 2 != 0 && prime && n > 2) || n == 2;
	}

	public static void findPrimeNumbers(Integer[] sourceNumbers) {
		List<Integer> result = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			if (isPrimeNumber(sourceNumber)) {
				result.add(sourceNumber);
			}
		}
		System.out.println("Простые числа: " + result);
	}

	public static void sortNumbersByAscAndDesc(Integer[] sourceNumbers) {
		List<Integer> numbers = Arrays.asList(sourceNumbers.clone());
		sort(numbers);
		System.out.println("Отсортированные числа в порядке возрастания: "
				+ numbers);
		reverse(numbers);
		System.out.println("Отсортированные числа в порядке убывания: "
				+ numbers);
	}

	private static Map<Integer, Integer> sortNumbersWithDescByValue(
			Map<Integer, Integer> map) {
		List<Map.Entry<Integer, Integer>> frequencyList = new LinkedList<Map.Entry<Integer, Integer>>(
				map.entrySet());
		sort(frequencyList, new Comparator<Object>() {
			@SuppressWarnings("unchecked")
			public int compare(Object o1, Object o2) {
				return ((Entry<Integer, Integer>) (o2)).getValue().compareTo(
						((Map.Entry<Integer, Integer>) (o1)).getValue());
			}
		});
		Map<Integer, Integer> result = new LinkedHashMap<Integer, Integer>();
		for (Entry<Integer, Integer> frequency : frequencyList) {
			result.put(frequency.getKey(), frequency.getValue());
		}
		return result;
	}

	private static void findNumbersFrequencyByDesc(Integer[] sourceNumbers) {
		Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			map.put(sourceNumber, frequency(Arrays.asList(sourceNumbers), sourceNumber));
		}
		System.out.println("Числа в порядке убывания частоты встречаемости "
				+ "чисел <Число=Встречаемость>: "
				+ sortNumbersWithDescByValue(map));
	}

	private static void findHappyNumbers(Integer[] sourceNumbers) {
		String number;
		List<Integer> result = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			number = sourceNumber.toString();
			if (number.length() == 4
					&& number.charAt(0) + number.charAt(1) == number.charAt(2)
							+ number.charAt(3)) {
				result.add(sourceNumber);
			}
		}
		System.out.println("“Счастливые” числа (Сумма 1-ой пары чисел "
				+ "= Сумме 2-ой пары): " + result);
	}

	private static void findFibonacciNumbers(Integer[] sourceNumbers) {
		// TODO не отображает 2 последних числа, если они являются числами
		// Фибоначчи
		List<Integer> result = new ArrayList<Integer>();
		for (int i = 0; i < sourceNumbers.length - 2; i++) {
			if (sourceNumbers.length < 3)
				break;
			else if (sourceNumbers[i + 2] == sourceNumbers[i]
					+ sourceNumbers[i + 1])
				result.add(sourceNumbers[i]);
		}
		System.out.println("Числа Фибоначчи: " + result);
	}

	private static void findPalindromicNumbers(Integer[] sourceNumbers) {
		List<StringBuilder> result = new ArrayList<StringBuilder>();
		for (Integer sourceNumber : sourceNumbers) {
			StringBuilder s = new StringBuilder(sourceNumber.toString());
			if (s.toString().equals(s.reverse().toString())) {
				result.add(s);
			}
		}
		System.out.println("Числа-палиндромы: " + result);
	}

	private static void findNumbersOfHalfSumOfNeighbors(Integer[] sourceNumbers) {
		Integer[] numbers = sourceNumbers.clone();
		List<Integer> result = new ArrayList<Integer>();
		for (int i = 1; i < numbers.length - 1; i++) {
			if (numbers.length < 3) {
				break;
			}
			if (numbers[i] == (numbers[i - 1] + numbers[i + 1]) / 2) {
				result.add(numbers[i]);
			}
		}
		System.out.println("Элементы, которые равны полусумме соседних "
				+ "элементов: " + result);
	}

	private static void findPeriodForTwoFirstPositiveNumbersInARow(
	// Algorithm @author is RodionGork
			Integer[] sourceNumbers) {
		long p, q, r, l, t, i;
		for (int n = 0; n < sourceNumbers.length - 1; n++) {
			if (sourceNumbers.length < 2) {
				break;
			} else if (sourceNumbers[n] >= 0 && sourceNumbers[n + 1] >= 0) {
				p = sourceNumbers[n];
				q = sourceNumbers[n + 1];
				r = p;
				for (i = 0; i < q; i++) {
					r = (r * 10) % q;
				}
				t = r;
				l = 0;
				do {
					r = (r * 10) % q;
					l++;
				} while (r != t);
				t = r = p;
				System.out.print("Период десятичной дроби p = m/n для "
						+ "первых двух целых положительных чисел n и m, "
						+ "расположенных подряд: 0.");
				for (i = 0; i < l; i++) {
					r = (r * 10) % q;
				}
				for (i = 0; r != t; i++) {
					System.out.print(t * 10 / q);
					r = (r * 10) % q;
					t = (t * 10) % q;
				}
				System.out.print('(');
				for (i = 0; i < l; i++) {
					System.out.print(t * 10 / q);
					t = (t * 10) % q;
				}

				System.out.println(')' + " = " + p + "/" + q);
				break;
			}
		}
	}

	private static void buildPascalTriangleForFirstPositiveNumber(
			Integer[] sourceNumbers) {
		List<Integer> positiveNumbers = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber >= 0) {
				positiveNumbers.add(sourceNumber);
			} else {
				break;
			}
		}
		int firstPositiveNumber = positiveNumbers.get(0);
		System.out.print("Сколько строк треугольника Паскаля для числа "
				+ firstPositiveNumber + " отображать? ");
		Scanner in = new Scanner(System.in);
		int rows = in.nextInt();
		for (int y = 0; y < rows; y++) {
			int c = firstPositiveNumber;
			for (int i = 0; i < rows - y; i++) {
				System.out.print("   ");
			}
			for (int x = 0; x <= y; x++) {
				System.out.print("   " + c + " ");
				c = c * (y - x) / (x + 1);
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		// 0. Ввести с консоли n целых чисел и поместить их в массив.
		System.out.print("Сколько целых чисел вы собираетесь ввести? ");
		Scanner in = new Scanner(System.in);
		int size = in.nextInt();
		if (size == 0) {
			System.out.print("Программа завершена.");
			System.exit(0);
		}
		Integer[] sourceNumbers = new Integer[size];
		System.out.print("Введите целые числа через пробел "
				+ "и нажмите <Enter>: ");
		for (int i = 0; i < size; i++) {
			sourceNumbers[i] = in.nextInt();
		}
		// 1. Четные и нечетные числа
		findEvenAndOddNumbers(sourceNumbers);

		// 2. Наибольшее и наименьшее число.
		findMaxAndMinNumbers(sourceNumbers);

		// 3. Числа, которые делятся на 3 или на 9.
		findModNumbers(3, sourceNumbers);
		findModNumbers(9, sourceNumbers);

		// 4. Числа, которые делятся на 5 и на 7.
		findModNumbers(5, sourceNumbers);
		findModNumbers(7, sourceNumbers);

		// 5. Элементы, расположенные методом пузырька по убыванию модулей.
		sortNumbersWithBubbleReverseByAbs(sourceNumbers);

		// 6. Все трехзначные числа, в десятичной записи которых нет одинаковых
		// цифр.
		findNumbersWithThreeDifferentDigits(sourceNumbers);

		// 7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
		findGreatestCommonDivisor(sourceNumbers);
		findLeastCommonMultiple(sourceNumbers);

		// 8. Простые числа.
		findPrimeNumbers(sourceNumbers);

		// 9. Отсортированные числа в порядке возрастания и убывания.
		sortNumbersByAscAndDesc(sourceNumbers);

		// 10. Числа в порядке убывания частоты встречаемости чисел.
		findNumbersFrequencyByDesc(sourceNumbers);

		// 11. “Счастливые” числа.
		findHappyNumbers(sourceNumbers);

		// 12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
		findFibonacciNumbers(sourceNumbers);

		// 13. Числа-палиндромы, значения которых в прямом и обратном порядке
		// совпадают.
		findPalindromicNumbers(sourceNumbers);

		// 14. Элементы, которые равны полусумме соседних элементов.
		findNumbersOfHalfSumOfNeighbors(sourceNumbers);

		// 15. Период десятичной дроби p = m/n для первых двух целых
		// положительных чисел n и m, расположенных подряд.
		findPeriodForTwoFirstPositiveNumbersInARow(sourceNumbers);

		// 16. Построить треугольник Паскаля для первого положительного числа.
		buildPascalTriangleForFirstPositiveNumber(sourceNumbers);
	}
}


...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37712954
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1stBlazkowicz6. Русскоязычный текст может потерятся в процессе компиляции. Что лучше сделать чтобы не потерялся?
Ознакомиться с native2ascii, ResourceBundle
http://docs.oracle.com/javase/tutorial/i18n/text/index.html

Denis_m1stСделал рефактор кода - в соответствии с почти всеми Вашими советами. Зацените спойлер :
Так гораздо лучше. Только отступы какие-то огромные.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37714064
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТолько отступы какие-то огромные. Пишу в Eclipse JEE v3.7.2, настройки форматирования - по умолчанию.

Какие лучше сделать отступы?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37714085
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1st,
2 символа :)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37714215
valiantsin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaBlazkowiczОборачивание тела в скобки это объективное улучшение качества кода.
полезность этого улучшения весьма спорна, вполне на грани вкуса. иначе не было бы столько споров на столь "очевидную" тему.

ИМХО: Все же лучше ставить - бывают перлы типа "if(...);"
где ";" тоже предложение - и если нету автопроверок найти достаточно сложно в чем проблема.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37716121
inv2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отписал автору в другой теме, так как не совсем java.
Но большинство задач тут решается как 2+2.

Вот ссылка: 12289566
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37716130
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inv2004Отписал автору в другой теме, так как не совсем java.
Но большинство задач тут решается как 2+2.
Вот ссылка: 12289566
У автора цели изучить Java, а не решить математические задачи.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37716169
inv2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz ,
Изучать какой-то конкретный язык - не очень много смысла, так задача показалась больше алгоритмической.

Но в целом - тогда да, в эту тему больше писать не буду.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37716172
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inv2004Изучать какой-то конкретный язык - не очень много смысла, так задача показалась больше алгоритмической.

Изучать английский нет смысла, так как Войну и Мир можно прочитать на русском.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37716947
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inv2004, Blazkowicz, спасибо, посмеялся. ж)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37718678
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавляю свежую версию программы.

OperationsWithNumbersStarter - стартовый класс:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
package chapt01.b;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import static chapt01.b.OperationsWithNumbersSolver.*;

/**
 * @author m1st
 * 
 */

// TODO translate rus text to eng
// TODO for immutable rus text see native2ascii, ResourceBundle

public class OperationsWithNumbersStarter {
	public static void main(String[] args) {
		// 0. Ввести с консоли n целых чисел и поместить их в массив. На консоль
		// вывести:
		Scanner in = new Scanner(System.in);
		List<Integer> input = new ArrayList<Integer>();
		System.out.print("Введите целые числа через пробел, "
				+ "для окончания введите q: ");
		while (true) {
			String number = in.next();
			if (number.equals("q")) {
				break;
			} else {
				try {
					input.add(Integer.parseInt(number));
				} catch (NumberFormatException e) {
					System.out.print("Неправильный формат. Повторите ввод: ");
				}
			}
		}
		if (input.size() == 0) {
			System.exit(0);
		}
		int[] sourceNumbers = new int[input.size()];
		System.arraycopy(toIntArray(input), 0, sourceNumbers, 0, input.size());
		// 1. Четные и нечетные числа
		findEvenAndOddNumbers(sourceNumbers);

		// 2. Наибольшее и наименьшее число.
		findMaxAndMinNumbers(toIntegerList(sourceNumbers));

		// 3. Числа, которые делятся на 3 или на 9.
		findModNumbers(3, sourceNumbers);

		// 4. Числа, которые делятся на 5 и на 7.
		findModNumbers(5, 7, sourceNumbers);

		// 5. Элементы, расположенные методом пузырька по убыванию модулей.
		int[] sourceNumbersClone1 = sourceNumbers.clone();
		sortNumbersWithBubbleReverseByAbs(sourceNumbersClone1);

		// 6. Все трехзначные числа, в десятичной записи которых нет одинаковых
		// цифр.
		findNumbersWithThreeDifferentDigits(sourceNumbers);

		// 7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
		findGreatestCommonDivisor(sourceNumbers);
		findLeastCommonMultiple(sourceNumbers);

		// 8. Простые числа.
		findPrimeNumbers(sourceNumbers);

		// 9. Отсортированные числа в порядке возрастания и убывания.
		sortNumbersByAscAndDesc(toIntegerList(sourceNumbers));

		// 10. Числа в порядке убывания частоты встречаемости чисел.
		findNumbersFrequencyByDesc(toIntegerList(sourceNumbers));

		// 11. “Счастливые” числа.
		findHappyNumbers(sourceNumbers);

		// 12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
		findFibonacciNumbers(sourceNumbers);

		// 13. Числа-палиндромы, значения которых в прямом и обратном порядке
		// совпадают.
		findPalindromicNumbers(sourceNumbers);

		// 14. Элементы, которые равны полусумме соседних элементов.
		int[] sourceNumbersClone2 = sourceNumbers.clone();
		findNumbersOfHalfSumOfNeighbors(sourceNumbersClone2);

		// 15. Период десятичной дроби p = m/n для первых двух целых
		// положительных чисел n и m, расположенных подряд.
		findPeriodForTwoFirstPositiveNumbersInARow(sourceNumbers);

		// 16. Построить треугольник Паскаля для первого положительного числа.
		buildPascalTriangleForFirstPositiveNumber(sourceNumbers);
	}
}



OperationsWithNumbersSolver - класс, содержащий методы вычислений:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
package chapt01.b;

import java.util.*;
import java.util.Map.Entry;

import static java.util.Collections.*;

public class OperationsWithNumbersSolver {
	public static List<Integer> toIntegerList(int[] array) {
		List<Integer> result = new ArrayList<Integer>();
		for (int anArray : array)
			result.add(anArray);
		return result;
	}

	public static int[] toIntArray(List<Integer> list) {
		int[] result = new int[list.size()];
		for (int i = 0; i < list.size(); i++) {
			result[i] = list.get(i);
		}
		return result;
	}

	public static void findEvenAndOddNumbers(int[] sourceNumbers) {
		List<Integer> evens = new ArrayList<Integer>();
		List<Integer> odds = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber % 2 == 0) {
				evens.add(sourceNumber);
			} else {
				odds.add(sourceNumber);
			}
		}
		System.out.println("Чётные числа: " + evens);
		System.out.println("Нечётные числа: " + odds);
	}

	public static void findMaxAndMinNumbers(List<Integer> sourceNumbers) {
		System.out.println("Наибольшее число: " + max(sourceNumbers));
		System.out.println("Наименьшее число: " + min(sourceNumbers));
	}

	public static void findModNumbers(int divider, int[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider + ": ");
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber % divider == 0) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void findModNumbers(int divider1, int divider2,
			int[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider1 + " и на "
				+ divider2 + ": ");
		for (Integer sourceNumber : sourceNumbers) {
			if ((sourceNumber % divider1 == 0) && (sourceNumber % divider2 == 0)) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void sortNumbersWithBubbleReverseByAbs(int[] sourceNumbers) {
		boolean swapped = true;
		int j = 0;
		int temp;
		while (swapped) {
			swapped = false;
			j++;
			for (int i = 0; i < sourceNumbers.length - j; i++) {
				if (Math.abs(sourceNumbers[i]) < Math.abs(sourceNumbers[i + 1])) {
					temp = sourceNumbers[i];
					sourceNumbers[i] = sourceNumbers[i + 1];
					sourceNumbers[i + 1] = temp;
					swapped = true;
				}
			}
		}
		System.out.print("Элементы, расположенные методом пузырька "
				+ "по убыванию модулей: ");
		for (int sourceNumber : sourceNumbers)
			System.out.print(sourceNumber + ", ");
	}

	public static void findNumbersWithThreeDifferentDigits(int[] sourceNumbers) {
		String number;
		System.out.print("\nВсе трехзначные числа, "
				+ "в десятичной записи которых нет одинаковых цифр: ");
		for (Integer sourceNumber : sourceNumbers) {
			number = sourceNumber.toString();
			if ((number.length() == 3) && (number.charAt(0) != number.charAt(1))
					&& (number.charAt(1) != number.charAt(2))
					&& (number.charAt(0) != number.charAt(2))) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static long findGreatestCommonDivisor(long a, long b) {
		while (b > 0) {
			long temp = b;
			b = a % b;
			a = temp;
		}
		return a;
	}

	public static void findGreatestCommonDivisor(int[] sourceNumbers) {
		long result = sourceNumbers[0];
		for (int i = 1; i < sourceNumbers.length; i++) {
			result = findGreatestCommonDivisor(result, sourceNumbers[i]);
		}
		System.out.println("Наибольший общий делитель: " + result);
	}

	public static long findLeastCommonMultiple(long a, long b) {
		return a * (b / findGreatestCommonDivisor(a, b));
	}

	public static void findLeastCommonMultiple(int[] sourceNumbers) {
		long result = sourceNumbers[0];
		for (int i = 1; i < sourceNumbers.length; i++) {
			if ((sourceNumbers[i] == 0 || sourceNumbers[0] == 0)
					|| (sourceNumbers[i] < 0 || sourceNumbers[0] < 0)) {
				break;
			}
			result = findLeastCommonMultiple(result, sourceNumbers[i]);
		}
		System.out.println("Наименьшее общее кратное: " + result);
	}

	public static boolean isPrimeNumber(int n) {
		boolean prime = true;
		for (long i = 3; i <= Math.sqrt(n); i += 2) {
			if (n <= 1)
				return false;
			if (n == 2)
				return true;
			if (n % i == 0) {
				prime = false;
				break;
			}
		}
		return ((n % 2 != 0) && prime && n > 2) || n == 2;
	}

	public static void findPrimeNumbers(int[] sourceNumbers) {
		System.out.print("Простые числа: ");
		for (Integer sourceNumber : sourceNumbers) {
			if (isPrimeNumber(sourceNumber)) {
				System.out.print(sourceNumber + ", ");
			}
		}
	}

	public static void sortNumbersByAscAndDesc(List<Integer> sourceNumbers) {
		sort(sourceNumbers);
		System.out.println("\nОтсортированные числа в порядке возрастания: "
				+ sourceNumbers);
		reverse(sourceNumbers);
		System.out.println("Отсортированные числа в порядке убывания: "
				+ sourceNumbers);
	}

	public static Map<Integer, Integer> sortNumbersWithDescByValue(
			Map<Integer, Integer> map) {
		List<Map.Entry<Integer, Integer>> frequencyList = new LinkedList<Map.Entry<Integer, Integer>>(
				map.entrySet());
		sort(frequencyList, new Comparator<Object>() {
			@SuppressWarnings("unchecked")
			public int compare(Object o1, Object o2) {
				return ((Entry<Integer, Integer>) (o2)).getValue().compareTo(
						((Map.Entry<Integer, Integer>) (o1)).getValue());
			}
		});
		Map<Integer, Integer> result = new LinkedHashMap<Integer, Integer>();
		for (Entry<Integer, Integer> frequency : frequencyList) {
			result.put(frequency.getKey(), frequency.getValue());
		}
		return result;
	}

	public static void findNumbersFrequencyByDesc(List<Integer> sourceNumbers) {
		Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			map.put(sourceNumber, frequency(sourceNumbers, sourceNumber));
		}
		System.out.println("Числа в порядке убывания частоты встречаемости "
				+ "чисел <Число=Встречаемость>: " + sortNumbersWithDescByValue(map));
	}

	public static void findHappyNumbers(int[] sourceNumbers) {
		String number;
		System.out.print("“Счастливые” числа (сумма 1-ой пары чисел "
				+ "= сумме 2-ой пары): ");
		for (Integer sourceNumber : sourceNumbers) {
			number = sourceNumber.toString();
			if ((number.length() == 4)
					&& (number.charAt(0) + number.charAt(1) == number.charAt(2)
							+ number.charAt(3))) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void findFibonacciNumbers(int[] sourceNumbers) {
		// TODO не отображает 2 последних числа, если они являются числами
		// Фибоначчи
		System.out.print("Числа Фибоначчи: ");
		for (int i = 0; i < sourceNumbers.length - 2; i++) {
			if (sourceNumbers.length < 3)
				break;
			else if (sourceNumbers[i + 2] == sourceNumbers[i] + sourceNumbers[i + 1])
				System.out.print(sourceNumbers[i] + ", ");
		}
		System.out.println();
	}

	public static void findPalindromicNumbers(int[] sourceNumbers) {
		System.out.print("Числа-палиндромы: ");
		for (Integer sourceNumber : sourceNumbers) {
			StringBuilder s = new StringBuilder(sourceNumber.toString());
			if (s.toString().equals(s.reverse().toString())) {
				System.out.print(s + ", ");
			}
		}
		System.out.println();
	}

	public static void findNumbersOfHalfSumOfNeighbors(int[] sourceNumbers) {
		System.out.print("Элементы, которые равны полусумме соседних "
				+ "элементов: ");
		for (int i = 1; i < sourceNumbers.length - 1; i++) {
			if (sourceNumbers.length < 3) {
				break;
			}
			if (sourceNumbers[i] == ((sourceNumbers[i - 1] + sourceNumbers[i + 1]) / 2)) {
				System.out.print(sourceNumbers[i] + ", ");
			}
		}
	}

	public static void findPeriodForTwoFirstPositiveNumbersInARow(
	// Algorithm by RodionGork
			int[] sourceNumbers) {
		long p, q, r, l, t, i;
		for (int n = 0; n < sourceNumbers.length - 1; n++) {
			if (sourceNumbers.length < 2) {
				break;
			} else if ((sourceNumbers[n] >= 0) && (sourceNumbers[n + 1] >= 0)) {
				p = sourceNumbers[n];
				q = sourceNumbers[n + 1];
				r = p;
				for (i = 0; i < q; i++) {
					r = (r * 10) % q;
				}
				t = r;
				l = 0;
				do {
					r = (r * 10) % q;
					l++;
				} while (r != t);
				t = r = p;
				System.out.print("\nПериод десятичной дроби p = m/n для "
						+ "первых двух целых положительных чисел n и m, "
						+ "расположенных подряд: 0.");
				for (i = 0; i < l; i++) {
					r = (r * 10) % q;
				}
				for (i = 0; r != t; i++) {
					System.out.print(t * 10 / q);
					r = (r * 10) % q;
					t = (t * 10) % q;
				}
				System.out.print('(');
				for (i = 0; i < l; i++) {
					System.out.print(t * 10 / q);
					t = (t * 10) % q;
				}

				System.out.println(')' + " = " + p + "/" + q);
				break;
			}
		}
	}

	public static void buildPascalTriangleForFirstPositiveNumber(
			int[] sourceNumbers) {
		// TODO найти первый номер, а не список c первым номером
		List<Integer> positiveNumbers = new ArrayList<Integer>();
		for (Integer sourceNumber : sourceNumbers) {
			if (sourceNumber >= 0) {
				positiveNumbers.add(sourceNumber);
			} else {
				break;
			}
		}
		int firstPositiveNumber = positiveNumbers.get(0);
		System.out.print("Сколько строк треугольника Паскаля для числа "
				+ firstPositiveNumber + " отображать? ");
		Scanner in = new Scanner(System.in);
		int rows = in.nextInt();
		for (int y = 0; y < rows; y++) {
			int c = firstPositiveNumber;
			for (int i = 0; i < rows - y; i++) {
				System.out.print("   ");
			}
			for (int x = 0; x <= y; x++) {
				System.out.print("   " + c + " ");
				c = c * (y - x) / (x + 1);
			}
			System.out.println();
		}
	}
}


...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37718924
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123мммм. У кого привык?
Я не спорю, я из Delphi и С++ пришёл.
Там все большинство аккуратных пишут
Код: java
1.
2.
3.
4.
5.
6.
7.
if ddd then
begin
  cccc;
  dddd;
end
else
  kkkk;



Ну так я не в Яве, а именно в C++ пишу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if(ddd)
{
  cccc;
  dddd;
}
else
{
  kkkk;
}



Давно приучили и я благодарен этому.
А в Яве принято первую скобку не переносить. У явистов видимо диагональное зрение ))
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37718938
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonУ явистов видимо диагональное зрение ))
а у Пайтонистов - ступенчатое
PS
Приравняли форматирование к семантике иностранных языков.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37728438
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправленная и улучшенная версия.

OperationsWithNumbersStarter - стартовый класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
package chapt01.b;

import static chapt01.b.OperationsWithNumbersSolver.*;

/**
 * @author m1st
 * 
 */

// TODO for immutable rus text see native2ascii, ResourceBundle

public class OperationsWithNumbersStarter {
	public static void main(String[] args) {
		// 0. Ввести с консоли n целых чисел и поместить их в массив. На консоль
		// вывести:
		int[] sourceNumbers = readInput();

		// 1. Четные и нечетные числа
		findEvenAndOddNumbers(sourceNumbers);

		// 2. Наибольшее и наименьшее число.
		findMaxAndMinNumbers(sourceNumbers);

		// 3. Числа, которые делятся на 3 или на 9.
		findModNumbers(3, sourceNumbers);

		// 4. Числа, которые делятся на 5 и на 7.
		findModNumbers(5, 7, sourceNumbers);

		// 5. Элементы, расположенные методом пузырька по убыванию модулей.
		int[] sourceNumbersClone1 = sourceNumbers.clone();
		sortNumbersWithBubbleReverseByAbs(sourceNumbersClone1);

		// 6. Все трехзначные числа, в десятичной записи которых нет одинаковых
		// цифр.
		findNumbersWithThreeDifferentDigits(sourceNumbers);

		// 7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
		findGreatestCommonDivisor(sourceNumbers);
		findLeastCommonMultiple(sourceNumbers);

		// 8. Простые числа.
		findPrimeNumbers(sourceNumbers);

		// 9. Отсортированные числа в порядке возрастания и убывания.
		sortNumbersByAscAndDesc(sourceNumbers);

		// 10. Числа в порядке убывания частоты встречаемости чисел.
		findNumbersFrequencyByDesc(sourceNumbers);

		// 11. “Счастливые” числа.
		findHappyNumbers(sourceNumbers);

		// 12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
		findFibonacciNumbers(sourceNumbers);

		// 13. Числа-палиндромы, значения которых в прямом и обратном порядке
		// совпадают.
		findPalindromicNumbers(sourceNumbers);

		// 14. Элементы, которые равны полусумме соседних элементов.
		int[] sourceNumbersClone2 = sourceNumbers.clone();
		findNumbersOfHalfSumOfNeighbors(sourceNumbersClone2);

		// 15. Период десятичной дроби p = m/n для первых двух целых
		// положительных чисел n и m, расположенных подряд.
		findPeriodForFirstTwoPositiveNumbersInARow(sourceNumbers);

		// 16. Построить треугольник Паскаля для первого положительного числа.
		buildPascalTriangleForFirstPositiveNumber(sourceNumbers);
	}
}



OperationsWithNumbersSolver - класс, содержащий методы вычислений:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
package chapt01.b;

import java.io.InputStream;
import java.util.*;
import java.util.Map.Entry;

/**
 * @author m1st
 * 
 */

public class OperationsWithNumbersSolver {
	public static int[] readInput(Scanner sc) {
		List<Integer> input = new ArrayList<Integer>();
		System.out.print("Введите целые числа через пробел, "
				+ "для окончания введите q: ");
		while (sc.hasNext()) {
			String number = sc.next();
			if (number.equals("q")) {
				break;
			} else {
				try {
					input.add(Integer.parseInt(number));
				} catch (NumberFormatException e) {
					System.out.print("Неправильный формат. Программа завершена. ");
					System.exit(0);
				}
			}
		}
		if (input.size() == 0) {
			System.exit(0);
		}
		return toIntArray(input);
	}

	public static int[] readInput(InputStream is) {
		return readInput(new Scanner(is));
	}

	public static int[] readInput() {
		return readInput(System.in);
	}

	public static List<Integer> toIntegerList(int[] array) {
		List<Integer> result = new ArrayList<Integer>(array.length);
		for (int element : array) {
			result.add(element);
		}
		return result;
	}

	public static int[] toIntArray(Collection<Integer> list) {
		int[] result = new int[list.size()];
		Iterator<Integer> it = list.iterator();
		for (int i = 0; i < list.size(); i++) {
			result[i] = it.next();
		}
		return result;
	}

	public static void findEvenAndOddNumbers(int[] sourceNumbers) {
		List<Integer> evens = new ArrayList<Integer>();
		List<Integer> odds = new ArrayList<Integer>();
		for (int sourceNumber : sourceNumbers) {
			if (sourceNumber % 2 == 0) {
				evens.add(sourceNumber);
			} else {
				odds.add(sourceNumber);
			}
		}
		System.out.println("Чётные числа: " + evens);
		System.out.println("Нечётные числа: " + odds);
	}

	public static void findMaxAndMinNumbers(int[] sourceNumbers) {
		List<Integer> numbers = toIntegerList(sourceNumbers);
		System.out.println("Наибольшее число: " + Collections.max(numbers));
		System.out.println("Наименьшее число: " + Collections.min(numbers));
	}

	public static void findModNumbers(int divider, int[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider + ": ");
		for (int sourceNumber : sourceNumbers) {
			if (sourceNumber % divider == 0) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void findModNumbers(int divider1, int divider2,
			int[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider1 + " и на "
				+ divider2 + ": ");
		for (int sourceNumber : sourceNumbers) {
			if ((sourceNumber % divider1 == 0) && (sourceNumber % divider2 == 0)) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void sortNumbersWithBubbleReverseByAbs(int[] sourceNumbers) {
		boolean swapped;
		int j = 0;
		int temp;
		do {
			swapped = false;
			j++;
			for (int i = 0; i < sourceNumbers.length - j; i++) {
				if (Math.abs(sourceNumbers[i]) < Math.abs(sourceNumbers[i + 1])) {
					temp = sourceNumbers[i];
					sourceNumbers[i] = sourceNumbers[i + 1];
					sourceNumbers[i + 1] = temp;
					swapped = true;
				}
			}
		} while (swapped);
		System.out.print("Элементы, расположенные методом пузырька "
				+ "по убыванию модулей: " + Arrays.toString(sourceNumbers) + "\n");
	}

	public static void findNumbersWithThreeDifferentDigits(int[] sourceNumbers) {
		String number;
		System.out.print("Все трехзначные числа, "
				+ "в десятичной записи которых нет одинаковых цифр: ");
		for (int sourceNumber : sourceNumbers) {
			if ((int) Math.log10(Math.abs(sourceNumber)) + 1 == 3) {
				number = String.valueOf(sourceNumber);
				if ((number.charAt(0) != number.charAt(1))
						&& (number.charAt(1) != number.charAt(2))
						&& (number.charAt(0) != number.charAt(2))) {
					System.out.print(sourceNumber + ", ");
				}
			}
		}
		System.out.println();
	}

	public static long findGreatestCommonDivisor(long a, long b) {
		while (b != 0) {
			long temp = b;
			b = a % b;
			a = temp;
		}
		return a;
	}

	public static void findGreatestCommonDivisor(int[] sourceNumbers) {
		long result = sourceNumbers[0];
		if (result == 0) {
			System.out.println("Наибольший общий делитель: " + result);
		} else {
			for (int i = 1; i < sourceNumbers.length; i++) {
				result = findGreatestCommonDivisor(result, sourceNumbers[i]);
			}
			System.out.println("Наибольший общий делитель: " + result);
		}
	}

	public static long findLeastCommonMultiple(long a, long b) {
		return a * (b / findGreatestCommonDivisor(a, b));
	}

	/**
	 * Метод вычисляет НОК чисел в массиве. Вычисление завершается на первом
	 * нулевом числе (оно не входит в НОК). <strong>Результат метода в случае
	 * переполнения не определен</strong>
	 * 
	 * @param sourceNumbers
	 *          числа для нахождения НОК
	 * @return НОК. В случае переполнения результат не определен.
	 */
	public static void findLeastCommonMultiple(int[] sourceNumbers) {
		long result = sourceNumbers[0];
		if (result == 0) {
			System.out.println("Наименьшее общее кратное: " + result);
		} else {
			for (int i = 1; i < sourceNumbers.length; i++) {
				if (sourceNumbers[i] == 0) {
					break;
				}
				result = findLeastCommonMultiple(result, sourceNumbers[i]);
			}
		}
		System.out.println("Наименьшее общее кратное: " + result);
	}

	public static boolean isPrimeNumber(int number) {
		final double numberSquareRoot = Math.sqrt(number);
		if (number <= 1) {
			return false;
		}
		if (number == 2) {
			return true;
		}
		for (long i = 3; i <= numberSquareRoot; i += 2) {
			if (number % i == 0) {
				return false;
			}
		}
		return ((number % 2 != 0) && number > 2);
	}

	public static void findPrimeNumbers(int[] sourceNumbers) {
		System.out.print("Простые числа: ");
		for (int sourceNumber : sourceNumbers) {
			if (isPrimeNumber(sourceNumber)) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void sortNumbersByAscAndDesc(int[] sourceNumbers) {
		List<Integer> numbers = toIntegerList(sourceNumbers);
		Collections.sort(numbers);
		System.out.println("Отсортированные числа в порядке возрастания: "
				+ numbers);
		Collections.reverse(numbers);
		System.out.println("Отсортированные числа в порядке убывания: " + numbers);
	}

	public static Map<Integer, Integer> sortNumbersWithDescByValue(
			Map<Integer, Integer> map) {
		List<Map.Entry<Integer, Integer>> frequencyList = new ArrayList<Map.Entry<Integer, Integer>>(
				map.entrySet());
		Collections.sort(frequencyList, new Comparator<Object>() {
			@SuppressWarnings("unchecked")
			public int compare(Object o1, Object o2) {
				return ((Entry<Integer, Integer>) (o2)).getValue().compareTo(
						((Map.Entry<Integer, Integer>) (o1)).getValue());
			}
		});
		Map<Integer, Integer> result = new LinkedHashMap<Integer, Integer>();
		for (Entry<Integer, Integer> frequency : frequencyList) {
			result.put(frequency.getKey(), frequency.getValue());
		}
		return result;
	}

	public static void findNumbersFrequencyByDesc(int[] sourceNumbers) {
		List<Integer> numbers = toIntegerList(sourceNumbers);
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (Integer number : numbers) {
			map.put(number, Collections.frequency(numbers, number));
		}
		System.out.println("Числа в порядке убывания частоты встречаемости "
				+ "чисел (число=встречаемость): " + sortNumbersWithDescByValue(map));
	}

	public static void findHappyNumbers(int[] sourceNumbers) {
		System.out.print("“Счастливые” числа (сумма 1-ой пары чисел "
				+ "= сумме 2-ой пары): ");
		int digit1, digit2, digit3, digit4;
		for (int sourceNumber : sourceNumbers) {
			if ((int) Math.log10(Math.abs(sourceNumber)) + 1 == 4) {
				digit1 = sourceNumber / 1000;
				digit2 = sourceNumber / 100 % 10;
				digit3 = sourceNumber % 100 / 10;
				digit4 = sourceNumber % 10;
				if (digit1 + digit2 == digit3 + digit4) {
					System.out.print(sourceNumber + ", ");
				}
			}
		}
		System.out.println();

	}

	public static void findFibonacciNumbers(int[] sourceNumbers) {
		System.out.print("Числа Фибоначчи: ");
		if (sourceNumbers.length >= 3) {
			if (sourceNumbers[0] == 0) {
				System.out.print("0, ");
				if (sourceNumbers[1] == 1) {
					System.out.print("1, ");
				}
			}
			for (int i = 2; i < sourceNumbers.length; i++) {
				if (sourceNumbers[i] == sourceNumbers[i - 2] + sourceNumbers[i - 1]) {
					System.out.print(sourceNumbers[i] + ", ");
				}
			}
		} else {
			System.out.print("sourceNumbers.length < 3");
		}
		System.out.println();
	}

	public static int reverseInt(int value) {
		int result = 0;
		final int limit = (int) Math.log10(Math.abs(value)) + 1;
		for (int i = 0; i < limit; i++) {
			result = result * 10 + value % 10;
			value /= 10;
		}
		return result;
	}

	public static void findPalindromicNumbers(int[] sourceNumbers) {
		System.out.print("Числа-палиндромы: ");
		for (int sourceNumber : sourceNumbers) {
			if (sourceNumber == reverseInt(sourceNumber)) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}

	public static void findNumbersOfHalfSumOfNeighbors(int[] sourceNumbers) {
		System.out.print("Элементы, которые равны полусумме соседних "
				+ "элементов: ");
		if (sourceNumbers.length >= 3) {
			for (int i = 1; i < sourceNumbers.length - 1; i++) {
				if (sourceNumbers[i] == ((float) (sourceNumbers[i - 1] + sourceNumbers[i + 1]) / 2)) {
					System.out.print(sourceNumbers[i] + ", ");
				}
			}
		} else {
			System.out.print("sourceNumbers.length < 3");
		}
		System.out.println();
	}

	public static int[] findFirstTwoPositiveNumbersInARow(int[] sourceNumbers) {
		int[] twoPositiveNumbers = new int[2];
		for (int i = 0; i < sourceNumbers.length - 1; i++) {
			if ((sourceNumbers[i] > 0) && (sourceNumbers[i + 1] > 0)) {
				twoPositiveNumbers[0] = sourceNumbers[i];
				twoPositiveNumbers[1] = sourceNumbers[i + 1];
				break;
			}
		}
		return twoPositiveNumbers;
	}

	// Algorithm by RodionGork
	public static void findPeriodForFirstTwoPositiveNumbersInARow(
			int[] sourceNumbers) {
		String message = "Период десятичной дроби для "
				+ "первых двух целых положительных чисел, " + "расположенных подряд: ";
		if (sourceNumbers.length >= 2) {
			int r, l, t, i;
			int[] twoPositiveNumbers = findFirstTwoPositiveNumbersInARow(sourceNumbers);
			if (twoPositiveNumbers[0] > 0 || twoPositiveNumbers[1] > 0) {
				int numerator = twoPositiveNumbers[0];
				int denominator = twoPositiveNumbers[1];
				r = numerator;
				for (i = 0; i < denominator; i++) {
					r = (r * 10) % denominator;
				}
				t = r;
				l = 0;
				do {
					r = (r * 10) % denominator;
					l++;
				} while (r != t);
				t = r = numerator;
				System.out.print(message + "0.");
				for (i = 0; i < l; i++) {
					r = (r * 10) % denominator;
				}
				for (i = 0; r != t; i++) {
					System.out.print(t * 10 / denominator);
					r = (r * 10) % denominator;
					t = (t * 10) % denominator;
				}
				System.out.print('(');
				for (i = 0; i < l; i++) {
					System.out.print(t * 10 / denominator);
					t = (t * 10) % denominator;
				}
				System.out.println(')' + " = " + numerator + "/" + denominator);
			} else {
				System.out.println(message + "нету двух целых положительных чисел, "
						+ "расположенных подряд");
			}
		} else {
			System.out.println(message + "sourceNumbers.length < 2");
		}
	}

	public static int findFirstPositiveNumber(int[] sourceNumbers) {
		int positiveNumber = 0;
		for (int sourceNumber : sourceNumbers) {
			if (sourceNumber > positiveNumber) {
				positiveNumber = sourceNumber;
				break;
			}
		}
		return positiveNumber;
	}

	public static void buildPascalTriangleForFirstPositiveNumber(
			int[] sourceNumbers) {
		final int firstPositiveNumber = findFirstPositiveNumber(sourceNumbers);
		if (firstPositiveNumber > 0) {
			System.out.print("Сколько строк треугольника Паскаля для числа "
					+ firstPositiveNumber + " отображать? ");
			Scanner in = new Scanner(System.in);
			if (in.hasNext()) {
				final int rows = in.nextInt();
				for (int y = 0; y < rows; y++) {
					int c = firstPositiveNumber;
					for (int i = 0; i < rows - y; i++) {
						System.out.print("   ");
					}
					for (int x = 0; x <= y; x++) {
						System.out.print("   " + c + " ");
						c = c * (y - x) / (x + 1);
					}

					System.out.println();
				}
			} else {
				System.out.println("!in.hasNext()");
			}
		} else {
			System.out.println("Треугольник Паскаля для первого положительного "
					+ "числа: нет чисел > 0");
		}
	}
}
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37728623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёкарный пельмень. Ну и букв ты написал. А вот тебе еще патчик.

+
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
8c8
<  * @author m1st
---
>  * @author m1st, mayton
12a13,25
>     
>         public static void println(Object obj){
>             System.out.println(obj);
>         }
>         
>         public static void print(Object obj){
>             print(obj);
>         }
>         
>         public static void println(){
>             System.out.println();
>         }
>     
15c28
< 		System.out.print("Введите целые числа через пробел, "
---
> 		print("Введите целые числа через пробел, "
25c38
< 					System.out.print("Неправильный формат. Программа завершена. ");
---
> 					print("Неправильный формат. Программа завершена. ");
71,72c84,85
< 		System.out.println("Чётные числа: " + evens);
< 		System.out.println("Нечётные числа: " + odds);
---
> 		println("Чётные числа: " + evens);
> 		println("Нечётные числа: " + odds);
77,78c90,91
< 		System.out.println("Наибольшее число: " + Collections.max(numbers));
< 		System.out.println("Наименьшее число: " + Collections.min(numbers));
---
> 		println("Наибольшее число: " + Collections.max(numbers));
> 		println("Наименьшее число: " + Collections.min(numbers));
82c95
< 		System.out.print("Числа, которые делятся на " + divider + ": ");
---
> 		print("Числа, которые делятся на " + divider + ": ");
85c98
< 				System.out.print(sourceNumber + ", ");
---
> 				print(sourceNumber + ", ");
88c101
< 		System.out.println();
---
> 		println();
93c106
< 		System.out.print("Числа, которые делятся на " + divider1 + " и на "
---
> 		print("Числа, которые делятся на " + divider1 + " и на "
97c110
< 				System.out.print(sourceNumber + ", ");
---
> 				print(sourceNumber + ", ");
100c113
< 		System.out.println();
---
> 		println();
119c132
< 		System.out.print("Элементы, расположенные методом пузырька "
---
> 		print("Элементы, расположенные методом пузырька "
125c138
< 		System.out.print("Все трехзначные числа, "
---
> 		print("Все трехзначные числа, "
133c146
< 					System.out.print(sourceNumber + ", ");
---
> 					print(sourceNumber + ", ");
137c150
< 		System.out.println();
---
> 		println();
152c165
< 			System.out.println("Наибольший общий делитель: " + result);
---
> 			println("Наибольший общий делитель: " + result);
157c170
< 			System.out.println("Наибольший общий делитель: " + result);
---
> 			println("Наибольший общий делитель: " + result);
177c190
< 			System.out.println("Наименьшее общее кратное: " + result);
---
> 			println("Наименьшее общее кратное: " + result);
186c199
< 		System.out.println("Наименьшее общее кратное: " + result);
---
> 		println("Наименьшее общее кратное: " + result);
206c219
< 		System.out.print("Простые числа: ");
---
> 		print("Простые числа: ");
209c222
< 				System.out.print(sourceNumber + ", ");
---
> 				print(sourceNumber + ", ");
212c225
< 		System.out.println();
---
> 		println();
218c231
< 		System.out.println("Отсортированные числа в порядке возрастания: "
---
> 		println("Отсортированные числа в порядке возрастания: "
221c234
< 		System.out.println("Отсортированные числа в порядке убывания: " + numbers);
---
> 		println("Отсортированные числа в порядке убывания: " + numbers);
248c261
< 		System.out.println("Числа в порядке убывания частоты встречаемости "
---
> 		println("Числа в порядке убывания частоты встречаемости "
253c266
< 		System.out.print(""Счастливые" числа (сумма 1-ой пары чисел "
---
> 		print(""Счастливые" числа (сумма 1-ой пары чисел "
263c276
< 					System.out.print(sourceNumber + ", ");
---
> 					print(sourceNumber + ", ");
267c280
< 		System.out.println();
---
> 		println();
272c285
< 		System.out.print("Числа Фибоначчи: ");
---
> 		print("Числа Фибоначчи: ");
275c288
< 				System.out.print("0, ");
---
> 				print("0, ");
277c290
< 					System.out.print("1, ");
---
> 					print("1, ");
282c295
< 					System.out.print(sourceNumbers[i] + ", ");
---
> 					print(sourceNumbers[i] + ", ");
286c299
< 			System.out.print("sourceNumbers.length < 3");
---
> 			print("sourceNumbers.length < 3");
288c301
< 		System.out.println();
---
> 		println();
302c315
< 		System.out.print("Числа-палиндромы: ");
---
> 		print("Числа-палиндромы: ");
305c318
< 				System.out.print(sourceNumber + ", ");
---
> 				print(sourceNumber + ", ");
308c321
< 		System.out.println();
---
> 		println();
312c325
< 		System.out.print("Элементы, которые равны полусумме соседних "
---
> 		print("Элементы, которые равны полусумме соседних "
317c330
< 					System.out.print(sourceNumbers[i] + ", ");
---
> 					print(sourceNumbers[i] + ", ");
321c334
< 			System.out.print("sourceNumbers.length < 3");
---
> 			print("sourceNumbers.length < 3");
323c336
< 		System.out.println();
---
> 		println();
360c373
< 				System.out.print(message + "0.");
---
> 				print(message + "0.");
365c378
< 					System.out.print(t * 10 / denominator);
---
> 					print(t * 10 / denominator);
369c382
< 				System.out.print('(');
---
> 				print('(');
371c384
< 					System.out.print(t * 10 / denominator);
---
> 					print(t * 10 / denominator);
374c387
< 				System.out.println(')' + " = " + numerator + "/" + denominator);
---
> 				println(')' + " = " + numerator + "/" + denominator);
376c389
< 				System.out.println(message + "нету двух целых положительных чисел, "
---
> 				println(message + "нету двух целых положительных чисел, "
380c393
< 			System.out.println(message + "sourceNumbers.length < 2");
---
> 			println(message + "sourceNumbers.length < 2");
399c412
< 			System.out.print("Сколько строк треугольника Паскаля для числа "
---
> 			print("Сколько строк треугольника Паскаля для числа "
407c420
< 						System.out.print("   ");
---
> 						print("   ");
410c423
< 						System.out.print("   " + c + " ");
---
> 						print("   " + c + " ");
414c427
< 					System.out.println();
---
> 					println();
417c430
< 				System.out.println("!in.hasNext()");
---
> 				println("!in.hasNext()");
420c433
< 			System.out.println("Треугольник Паскаля для первого положительного "
---
> 			println("Треугольник Паскаля для первого положительного "
424c437
< }
\ No newline at end of file
---
> }


...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37730297
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЁкарный пельмень. Ну и букв ты написал. А вот тебе еще патчик.
Спасибо. Как я понял, патч заключается в этих 3 методах, которые и достаточно было указать. ж)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	public static void println(Object obj) {
		System.out.println(obj);
	}

	public static void print(Object obj) {
		print(obj);
	}

	public static void println() {
		System.out.println();
	} 


Что все эти числа "8c8..." значат в вашем исходнике?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37730555
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37747377
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправленная и улучшенная версия.

OperationsWithNumbersStarter - стартовый класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
package chapt01.b;

import static chapt01.b.OperationsWithNumbersSolver.*;

/**
 * @author m1st
 * 
 */
public class OperationsWithNumbersStarter {
    public static void main(String[] args) {
	// 0. Ввести с консоли n целых чисел и поместить их в массив. На консоль
	// вывести:
	int[] sourceNumbers = readInput();
	if (sourceNumbers.length == 0) {
	    System.out.println("sourceNumbers.length == 0");
	    System.exit(0);
	}
	// 1. Четные и нечетные числа
	findEvenAndOddNumbers(sourceNumbers);

	// 2. Наибольшее и наименьшее число.
	findMaxAndMinNumbers(sourceNumbers);

	// 3. Числа, которые делятся на 3 или на 9.
	findModNumbers(3, sourceNumbers);

	// 4. Числа, которые делятся на 5 и на 7.
	findModNumbers(5, 7, sourceNumbers);

	// 5. Элементы, расположенные методом пузырька по убыванию модулей.
	int[] sourceNumbersClone1 = sourceNumbers.clone();
	sortNumbersWithBubbleReverseByAbs(sourceNumbersClone1);

	// 6. Все трехзначные числа, в десятичной записи которых нет одинаковых
	// цифр.
	findNumbersWithThreeDifferentDigits(sourceNumbers);

	// 7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
	findGreatestCommonDivisor(sourceNumbers);
	findLeastCommonMultiple(sourceNumbers);

	// 8. Простые числа.
	findPrimeNumbers(sourceNumbers);

	// 9. Отсортированные числа в порядке возрастания и убывания.
	sortNumbersByAscAndDesc(sourceNumbers);

	// 10. Числа в порядке убывания частоты встречаемости чисел.
	findNumbersFrequencyByDesc(sourceNumbers);

	// 11. “Счастливые” числа.
	findHappyNumbers(sourceNumbers);

	// 12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
	findFibonacciNumbers(sourceNumbers);

	// 13. Числа-палиндромы, значения которых в прямом и обратном порядке
	// совпадают.
	findPalindromicNumbers(sourceNumbers);

	// 14. Элементы, которые равны полусумме соседних элементов.
	int[] sourceNumbersClone2 = sourceNumbers.clone();
	findNumbersOfHalfSumOfNeighbors(sourceNumbersClone2);

	// 15. Период десятичной дроби p = m/n для первых двух целых
	// положительных чисел n и m, расположенных подряд.
	findPeriodForFirstTwoPositiveNumbersInARow(sourceNumbers);

	// 16. Построить треугольник Паскаля для первого положительного числа.
	buildPascalTriangleForFirstPositiveNumber(sourceNumbers);
    }
}



OperationsWithNumbersSolver - класс, содержащий методы вычислений:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
package chapt01.b;

import java.io.InputStream;
import java.util.*;
import java.util.Map.Entry;

/**
 * @author m1st
 * 
 */
public class OperationsWithNumbersSolver {
    public static void println(Object obj) {
	System.out.println(obj);
    }

    public static void print(Object obj) {
	System.out.print(obj);
    }

    public static void println() {
	System.out.println();
    }

    public static int[] toIntArray(Collection<Integer> list) {
	int[] result = new int[list.size()];
	Iterator<Integer> it = list.iterator();
	for (int i = 0; i < list.size(); i++) {
	    result[i] = it.next();
	}
	return result;
    }

    public static int[] readInput(Scanner sc) {
	List<Integer> input = new ArrayList<Integer>();
	print("Введите целые числа через пробел, для окончания введите q: ");
	while (sc.hasNext()) {
	    String number = sc.next();
	    if (number.equals("q")) {
		break;
	    } else {
		try {
		    input.add(Integer.parseInt(number));
		} catch (NumberFormatException e) {
		    sc.close();
		    print("Неправильный формат. Программа завершена. ");
		    System.exit(0);
		}
	    }
	}
	return toIntArray(input);
    }

    public static int[] readInput(InputStream is) {
	return readInput(new Scanner(is));
    }

    public static int[] readInput() {
	return readInput(System.in);
    }

    public static List<Integer> toIntegerList(int[] array) {
	List<Integer> result = new ArrayList<Integer>(array.length);
	for (int element : array) {
	    result.add(element);
	}
	return result;
    }

    public static void findEvenAndOddNumbers(int[] sourceNumbers) {
	List<Integer> evens = new ArrayList<Integer>();
	List<Integer> odds = new ArrayList<Integer>();
	for (int sourceNumber : sourceNumbers) {
	    if (sourceNumber % 2 == 0) {
		evens.add(sourceNumber);
	    } else {
		odds.add(sourceNumber);
	    }
	}
	println("Чётные числа: " + evens);
	println("Нечётные числа: " + odds);
    }

    public static void findMaxAndMinNumbers(int[] sourceNumbers) {
	List<Integer> numbers = toIntegerList(sourceNumbers);
	println("Наибольшее число: " + Collections.max(numbers));
	println("Наименьшее число: " + Collections.min(numbers));
    }

    public static void findModNumbers(int divider, int[] sourceNumbers) {
	print("Числа, которые делятся на " + divider + ": ");
	for (int sourceNumber : sourceNumbers) {
	    if (sourceNumber % divider == 0) {
		print(sourceNumber + ", ");
	    }
	}
	println();
    }

    public static void findModNumbers(int divider1, int divider2,
	    int[] sourceNumbers) {
	print("Числа, которые делятся на " + divider1 + " и на " + divider2
		+ ": ");
	for (int sourceNumber : sourceNumbers) {
	    if ((sourceNumber % divider1 == 0)
		    && (sourceNumber % divider2 == 0)) {
		print(sourceNumber + ", ");
	    }
	}
	println();
    }

    public static void sortNumbersWithBubbleReverseByAbs(int[] sourceNumbers) {
	boolean swapped;
	int temp, j = 0;
	do {
	    swapped = false;
	    j++;
	    for (int i = 0; i < sourceNumbers.length - j; i++) {
		if (Math.abs((long) sourceNumbers[i]) < Math
			.abs((long) sourceNumbers[i + 1])) {
		    temp = sourceNumbers[i];
		    sourceNumbers[i] = sourceNumbers[i + 1];
		    sourceNumbers[i + 1] = temp;
		    swapped = true;
		}
	    }
	} while (swapped);
	print("Элементы, расположенные методом пузырька по убыванию модулей: "
		+ Arrays.toString(sourceNumbers) + "\n");
    }

    public static void findNumbersWithThreeDifferentDigits(int[] sourceNumbers) {
	int digit1, digit2, digit3;
	print("Все трехзначные числа, в десятичной записи которых нет одинаковых цифр: ");
	for (int sourceNumber : sourceNumbers) {
	    digit1 = sourceNumber / 100;
	    digit2 = sourceNumber / 10 % 10;
	    digit3 = sourceNumber % 10;
	    // Ищем трехзначные числа
	    if ((sourceNumber >= 100 && sourceNumber <= 999)
		    || (sourceNumber <= -100 && sourceNumber >= -999)) {
		if ((digit1 != digit2) && (digit2 != digit3)
			&& (digit1 != digit3)) {
		    print(sourceNumber + ", ");
		}
	    }
	}
	println();
    }

    public static long findGreatestCommonDivisor(long a, long b) {
	while (b != 0) {
	    long temp = b;
	    b = a % b;
	    a = temp;
	}
	return a;
    }

    public static void findGreatestCommonDivisor(int[] sourceNumbers) {
	long result = sourceNumbers[0];
	if (result == 0) {
	    println("Наибольший общий делитель: " + result);
	} else {
	    for (int i = 1; i < sourceNumbers.length; i++) {
		result = findGreatestCommonDivisor(result, sourceNumbers[i]);
	    }
	    println("Наибольший общий делитель: " + result);
	}
    }

    public static long findLeastCommonMultiple(long a, long b) {
	return a * (b / findGreatestCommonDivisor(a, b));
    }

    /**
     * Метод вычисляет НОК чисел в массиве. Вычисление завершается на первом
     * нулевом числе (оно не входит в НОК). <strong>Результат метода в случае
     * переполнения не определен</strong>
     * 
     * @param sourceNumbers
     *            числа для нахождения НОК
     * @return НОК. В случае переполнения результат не определен.
     */
    public static void findLeastCommonMultiple(int[] sourceNumbers) {
	long result = sourceNumbers[0];
	if (result == 0) {
	    println("Наименьшее общее кратное: " + result);
	} else {
	    for (int i = 1; i < sourceNumbers.length; i++) {
		if (sourceNumbers[i] == 0) {
		    break;
		}
		result = findLeastCommonMultiple(result, sourceNumbers[i]);
	    }
	}
	println("Наименьшее общее кратное: " + result);
    }

    public static boolean isPrimeNumber(int number) {
	if (number <= 1) {
	    return false;
	}
	if (number == 2) {
	    return true;
	}
	if (number % 2 != 0) {
	    return true;
	}
	final double ceiledNumberSqrt = Math.ceil(Math.sqrt(number));
	for (long i = 3; i <= ceiledNumberSqrt; i += 2) {
	    if (number % i == 0) {
		return false;
	    }
	}
	return false;
    }

    public static void findPrimeNumbers(int[] sourceNumbers) {
	print("Простые числа: ");
	for (int sourceNumber : sourceNumbers) {
	    if (isPrimeNumber(sourceNumber)) {
		print(sourceNumber + ", ");
	    }
	}
	println();
    }

    public static void sortNumbersByAscAndDesc(int[] sourceNumbers) {
	List<Integer> numbers = toIntegerList(sourceNumbers);
	Collections.sort(numbers);
	println("Отсортированные числа в порядке возрастания: " + numbers);
	Collections.reverse(numbers);
	println("Отсортированные числа в порядке убывания: " + numbers);
    }

    public static Map<Integer, Integer> sortNumbersWithDescByValue(
	    Map<Integer, Integer> map) {
	List<Entry<Integer, Integer>> frequencyList = new ArrayList<Entry<Integer, Integer>>(
		map.entrySet());
	Collections.sort(frequencyList,
		new Comparator<Entry<Integer, Integer>>() {
		    public int compare(Entry<Integer, Integer> o1,
			    Entry<Integer, Integer> o2) {
			return ((Entry<Integer, Integer>) (o2)).getValue()
				.compareTo(
					((Entry<Integer, Integer>) (o1))
						.getValue());
		    }
		});
	Map<Integer, Integer> result = new LinkedHashMap<Integer, Integer>();
	for (Entry<Integer, Integer> frequency : frequencyList) {
	    result.put(frequency.getKey(), frequency.getValue());
	}
	return result;
    }

    public static void findNumbersFrequencyByDesc(int[] sourceNumbers) {
	List<Integer> numbers = toIntegerList(sourceNumbers);
	Map<Integer, Integer> map = new HashMap<Integer, Integer>();
	int frequency = 1;
	for (Integer number : numbers) {
	    if (map.containsKey(number)) {
		map.put(number, ++frequency);
	    } else {
		map.put(number, 1);
	    }
	}
	println("Числа в порядке убывания частоты встречаемости чисел (число=встречаемость): "
		+ sortNumbersWithDescByValue(map));
    }

    public static void findHappyNumbers(int[] sourceNumbers) {
	print("“Счастливые” числа (сумма 1-ой пары чисел = сумме 2-ой пары): ");
	int digit1, digit2, digit3, digit4;
	for (int sourceNumber : sourceNumbers) {
	    if ((sourceNumber >= 1000 && sourceNumber <= 9999)
		    || (sourceNumber <= -1000 && sourceNumber >= -9999)) {
		digit1 = sourceNumber / 1000;
		digit2 = sourceNumber / 100 % 10;
		digit3 = sourceNumber % 100 / 10;
		digit4 = sourceNumber % 10;
		if (digit1 + digit2 == digit3 + digit4) {
		    print(sourceNumber + ", ");
		}
	    }
	}
	println();

    }

    /**
     * Метод находит числа Фибоначчи в массиве. <strong>Результат метода в
     * случае переполнения не определен</strong>
     * 
     * @param sourceNumbers
     *            числа для нахождения чисел Фибоначчи
     * @return числа Фибоначчи. В случае переполнения результат не определен.
     */
    public static void findFibonacciNumbers(int[] sourceNumbers) {
	print("Числа Фибоначчи: ");
	if (sourceNumbers.length >= 3) {
	    if (sourceNumbers[0] == 0) {
		print("0, ");
		if (sourceNumbers[1] == 1) {
		    print("1, ");
		}
	    }
	    for (int i = 2; i < sourceNumbers.length; i++) {
		if (sourceNumbers[i] == ((long) sourceNumbers[i - 2] + (long) sourceNumbers[i - 1])) {
		    print(sourceNumbers[i] + ", ");
		}
	    }
	} else {
	    print("sourceNumbers.length < 3");
	}
	println();
    }

    public static long reverseInt(int value) {
	long result = 0;
	while (value != 0) {
	    result = result * 10 + value % 10;
	    value /= 10;
	}
	return result;
    }

    public static void findPalindromicNumbers(int[] sourceNumbers) {
	print("Числа-палиндромы: ");
	for (int sourceNumber : sourceNumbers) {
	    if (sourceNumber == reverseInt(sourceNumber)) {
		print(sourceNumber + ", ");
	    }
	}
	println();
    }

    /**
     * Метод находит элементы, которые равны полусумме соседних элементов в
     * массиве. <strong>Результат метода в случае переполнения не
     * определен</strong>
     * 
     * @param sourceNumbers
     *            числа для нахождения элементов, которые равны полусумме
     *            соседних элементов в массиве
     * @return элементы, которые равны полусумме соседних элементов в массиве. В
     *         случае переполнения результат не определен.
     */
    public static void findNumbersOfHalfSumOfNeighbors(int[] sourceNumbers) {
	print("Элементы, которые равны полусумме соседних элементов: ");
	if (sourceNumbers.length >= 3) {
	    for (int i = 1; i < sourceNumbers.length - 1; i++) {
		if (sourceNumbers[i] == ((double) ((long) sourceNumbers[i - 1] + (long) sourceNumbers[i + 1]) / 2)) {
		    print(sourceNumbers[i] + ", ");
		}
	    }
	} else {
	    print("sourceNumbers.length < 3");
	}
	println();
    }

    public static int[] findFirstTwoPositiveNumbersInARow(int[] sourceNumbers) {
	int[] twoPositiveNumbers = new int[2];
	for (int i = 0; i < sourceNumbers.length - 1; i++) {
	    if ((sourceNumbers[i] > 0) && (sourceNumbers[i + 1] > 0)) {
		twoPositiveNumbers[0] = sourceNumbers[i];
		twoPositiveNumbers[1] = sourceNumbers[i + 1];
		break;
	    }
	}
	return twoPositiveNumbers;
    }

    public static void findPeriodForFirstTwoPositiveNumbersInARow(
	    int[] sourceNumbers) {
	String message = "Период десятичной дроби для первых двух целых положительных чисел, расположенных подряд: ";
	if (sourceNumbers.length < 2) {
	    println(message + "sourceNumbers.length < 2");
	    return;
	}
	int[] twoPositiveNumbers = findFirstTwoPositiveNumbersInARow(sourceNumbers);
	if (twoPositiveNumbers.length < 2) {
	    println(message
		    + "нет двух целых положительных чисел, расположенных подряд");
	    return;
	}
	int numerator = twoPositiveNumbers[0];
	int denominator = twoPositiveNumbers[1];
	if (numerator % denominator == 0) {
	    print(numerator / denominator + ".(0)");
	    return;
	}
	// Выделение из знаменателя наибольшей 2^
	int s = denominator % 2;
	int l = 0;
	while (s == 0) {
	    denominator = denominator / 2;
	    s = denominator % 2;
	    l++;
	}
	// Выделение из знаменателя наибольшей 5^
	s = denominator % 5;
	int l1 = 0;
	while (s == 0) {
	    denominator = denominator / 5;
	    s = denominator % 5;
	    l1++;
	}
	// Вычисление длины периода с новым знаменателем
	int periodLenth = 1;
	int r = 10;
	while (r != 1) {
	    r = (10 * r) % denominator;
	    if (r == 0) {
		break;
	    }
	    periodLenth++;
	}
	long beforePeriodLenth;
	if (l1 > l) {
	    beforePeriodLenth = l1;
	} else {
	    beforePeriodLenth = l;
	}
	denominator = twoPositiveNumbers[1];
	print(message + numerator / denominator + ".");
	numerator = numerator % denominator;
	for (int i = 0; i < beforePeriodLenth; i++) {
	    print((numerator * 10) / denominator);
	    numerator = (numerator * 10) % denominator;
	}
	print("(");
	for (int i = 0; i < periodLenth; i++) {
	    print((numerator * 10) / denominator);
	    numerator = (numerator * 10) % denominator;
	}
	print(") = " + twoPositiveNumbers[0] + " / " + twoPositiveNumbers[1] + "\n");
    }

    public static int findFirstPositiveNumber(int[] sourceNumbers) {
	for (int sourceNumber : sourceNumbers) {
	    if (sourceNumber > 0) {
		return sourceNumber;
	    }
	}
	return 0;
    }

    public static void buildPascalTriangleForFirstPositiveNumber(
	    int[] sourceNumbers) {
	final int firstPositiveNumber = findFirstPositiveNumber(sourceNumbers);
	if (firstPositiveNumber == 0) {
	    println("!in.hasNext()");
	} else {
	    print("Сколько строк треугольника Паскаля для числа "
		    + firstPositiveNumber + " отображать? ");
	    Scanner sc = new Scanner(System.in);
	    if (!sc.hasNext()) {
		sc.close();
		println("Треугольник Паскаля для первого положительного числа: нет чисел > 0");
	    } else {
		final int rows = sc.nextInt();
		for (int y = 0; y < rows; y++) {
		    int c = firstPositiveNumber;
		    for (int i = 0; i < rows - y; i++) {
			print("   ");
		    }
		    for (int x = 0; x <= y; x++) {
			print("   " + c + " ");
			c = c * (y - x) / (x + 1);
		    }

		    println();
		}
	    }
	    sc.close();
	}
    }
}


...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37747392
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерфейс некрасивый какой-то. А если мне надо делить на 3, 5 и 7 ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static void findModNumbers(int divider1, int divider2,
			int[] sourceNumbers) {
		System.out.print("Числа, которые делятся на " + divider1 + " и на "
				+ divider2 + ": ");
		for (int sourceNumber : sourceNumbers) {
			if ((sourceNumber % divider1 == 0) && (sourceNumber % divider2 == 0)) {
				System.out.print(sourceNumber + ", ");
			}
		}
		System.out.println();
	}
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37747682
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИнтерфейс некрасивый какой-то. А если мне надо делить на 3, 5 и 7 ?
Что насчет такого интерфейса?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    public static void findModNumbers(int[] sourceNumbers, int... args) {
	print("Числа, которые делятся на ");
	for (int arg : args) {
	    print(arg + ", ");
	}
	print(": ");
	switch (args.length) {
	case 1:
	    for (int sourceNumber : sourceNumbers) {
		if (sourceNumber % args[0] == 0) {
		    print(sourceNumber + ", ");
		}
	    }
	    println();
	    break;
	case 2:
	    for (int sourceNumber : sourceNumbers) {
		if (sourceNumber % args[0] == 0 && sourceNumber % args[1] == 0) {
		    print(sourceNumber + ", ");
		}
	    }
	    println();
	    break;
	case 3:
	    // вычисление
	    println();
	    break;
	default:
	    println("Ошибка аргумента");
	}
    }
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37747758
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1st, как-то switch некрасиво смотриться. Можно без него обойтись?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37749560
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDenis_m1st, как-то switch некрасиво смотриться. Можно без него обойтись?
Так?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public static void findModNumbers(int[] sourceNumbers, int... args) {
	print("Числа, которые делятся на ");
	for (int arg : args) {
	    print(arg + ", ");
	}
	print(": ");
	if (args.length == 1) {
	    for (int sourceNumber : sourceNumbers) {
		if (sourceNumber % args[0] == 0) {
		    print(sourceNumber + ", ");
		}
	    }
	if (args.length == 2) {
	    for (int sourceNumber : sourceNumbers) {
		if (sourceNumber % args[0] == 0 && sourceNumber % args[1] == 0) {
		    print(sourceNumber + ", ");
		}
	    }
	if (args.length == n) {
	    // вычисление
	}
	    println();
    }
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37749567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис, ну вот скажи мне, а если у меня будет 100 целых чисел в качестве
второго аргумента ты будешь делать 100 блоков if (..) {} ?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37749713
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonДавно приучили и я благодарен этому.

Лучше приучите себя легко переключаться на другие команды форматирования. Мало ли, попадете в команду, использующую египетские скобочки.
...
Рейтинг: 0 / 0
25 сообщений из 117, страница 4 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачи на числа. Решение. Покритикуйте. (часть #1)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]