powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачи на числа. Решение. Покритикуйте. (часть #1)
117 сообщений из 117, показаны все 5 страниц
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707153
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ввести с консоли n целых чисел и поместить их в массив. На консоль вывести:
1. Четные и нечетные числа.
2. Наибольшее и наименьшее число.
3. Числа, которые делятся на 3 или на 9.
4. Числа, которые делятся на 5 и на 7.
5. Элементы, расположенные методом пузырька по убыванию модулей.
6. Все трехзначные числа, в десятичной записи которых нет одинаковых цифр.
7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
8. Простые числа.
9. Отсортированные числа в порядке возрастания и убывания.
10. Числа в порядке убывания частоты встречаемости чисел.
11. “Счастливые” числа.
12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
13. Числа-палиндромы, значения которых в прямом и обратном порядке совпадают.
14. Элементы, которые равны полусумме соседних эле¬ментов.
15. Период десятичной дроби p = m/n для первых двух целых положительных чисел n и m, расположенных подряд.
16. Построить треугольник Паскаля для первого положительного числа.

Привет, решение данных заданий на Java - ниже. Покритикуйте .

Код: 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 static java.util.Collections.*;

/**
 * Ввести с консоли n целых чисел и поместить их в массив. На консоль вывести:
 * 
 * @author m1st
 */

public class OperationsWithNumbers {
	private static List<Integer> divider(int divider, Integer[] array) {
		List<Integer> divided = new LinkedList<Integer>();
		for (Integer anArray : array) {
			if (anArray % divider == 0)
				divided.add(anArray);
		}
		return divided;
	}

	private static Map revSortByVal(Map<Integer, Integer> map) {
		List<Object> list = new LinkedList<Object>(map.entrySet());
		sort(list, new Comparator() {
			public int compare(Object o1, Object o2) {
				return ((Comparable) ((Map.Entry) (o2)).getValue())
						.compareTo(((Map.Entry) (o1)).getValue());
			}
		});
		Map result = new LinkedHashMap();
		for (Object aList : list) {
			Map.Entry entry = (Map.Entry) aList;
			result.put(entry.getKey(), entry.getValue());
		}
		return result;
	}

	private static List<Integer> bubbleRevSortByMod(Integer[] input) {
		Integer[] nums = input.clone();
		boolean swapped = true;
		int j = 0;
		int tmp;
		while (swapped) {
			swapped = false;
			j++;
			for (int i = 0; i < nums.length - j; i++) {
				if (Math.abs(nums[i]) < Math.abs(nums[i + 1])) {
					tmp = nums[i];
					nums[i] = nums[i + 1];
					nums[i + 1] = tmp;
					swapped = true;
				}
			}
		}
		return Arrays.asList(nums);
	}

	private static long gcd(long a, long b) // Greatest Common Divisor
	{
		while (b > 0) {
			long temp = b;
			b = a % b;
			a = temp;
		}
		return a;
	}

	private static long gcd(Integer[] input) {
		long result = input[0];
		for (int i = 1; i < input.length; i++)
			result = gcd(result, input[i]);
		return result;
	}

	private static long lcm(long a, long b) // Least Common Multiple
	{
		return a * (b / gcd(a, b));
	}

	private static long lcm(Integer[] input) {
		long result = input[0];
		for (int i = 1; i < input.length; i++) {
			if ((input[i] == 0 || input[0] == 0)
					|| (input[i] < 0 || input[0] < 0))
				break;
			result = lcm(result, input[i]);
		}
		return result;
	}

	private static List<Integer> list1 = new LinkedList<Integer>();
	private static List<Integer> list2 = new LinkedList<Integer>();

	public static List<Integer> primeNums(Integer[] input) {
		list1.clear();
		for (Integer anInput : input) {
			if (isPrimeNum(anInput)) {
				list1.add(anInput);
			}
		}
		return list1;
	}

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

	private static Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
	private static Map<Integer, Integer> invMap = new TreeMap<Integer, Integer>();

	private static void put(Integer key, Integer value) {
		map.put(key, value);
		invMap.put(value, key);
	}

	private static void buildPascalTriangle(int number, int rows) {
		for (int y = 0; y < rows; y++) {
			int c = number;
			for (int w = 0; w < rows - y; w++) {
				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) {
		System.out.print("Сколько целых чисел вы собираетесь ввести? ");
		Scanner in = new Scanner(System.in);
		int size = in.nextInt();
		if (size == 0) {
			System.out.print("Программа завершена.");
			System.exit(0);
		}
		Integer[] numbers = new Integer[size];
		System.out.print("Введите целые числа через пробел "
				+ "и нажмите <Enter>: ");
		for (int i = 0; i < size; i++)
			numbers[i] = in.nextInt();

		// 1. Четные и нечетные числа
		for (int i = 0; i < size; i++) {
			if (numbers[i] % 2 == 0)
				list1.add(numbers[i]);
			else
				list2.add(numbers[i]);
		}
		System.out.println("Чётные числа: " + list1);
		System.out.println("Нечётные числа: " + list2);

		// 2. Наибольшее и наименьшее число.
		List<Integer> listFromArray = Arrays.asList(numbers);
		System.out.println("Наибольшее число: " + max(listFromArray));
		System.out.println("Наименьшее число: " + min(listFromArray));

		// 3. Числа, которые делятся на 3 или на 9.
		System.out.println("Числа, которые делятся на 3: "
				+ divider(3, numbers));
		System.out.println("Числа, которые делятся на 9: "
				+ divider(9, numbers));

		// 4. Числа, которые делятся на 5 и на 7.
		System.out.println("Числа, которые делятся на 5: "
				+ divider(5, numbers));
		System.out.println("Числа, которые делятся на 7: "
				+ divider(7, numbers));

		// 5. Элементы, расположенные методом пузырька по убыванию модулей. //
		System.out.println("Элементы, расположенные методом пузырька "
				+ "по убыванию модулей: " + bubbleRevSortByMod(numbers));

		// 6. Все трехзначные числа, в десятичной записи которых нет одинаковых
		// цифр.
		String num;
		list1.clear();
		for (int i = 0; i < size; i++) {
			num = numbers[i].toString();
			if (num.length() == 3 && num.charAt(0) != num.charAt(1)
					&& num.charAt(1) != num.charAt(2)
					&& num.charAt(0) != num.charAt(2))
				list1.add(numbers[i]);
		}
		System.out.println("Все трехзначные числа, "
				+ "в десятичной записи которых нет одинаковых цифр: " + list1);

		// 7. Наибольший общий делитель и наименьшее общее кратное этих чисел.
		System.out.println("Наибольший общий делитель: " + gcd(numbers));
		System.out.println("Наименьшее общее кратное: " + lcm(numbers));

		// 8. Простые числа.
		System.out.println("Простые числа: " + primeNums(numbers));

		// 9. Отсортированные числа в порядке возрастания и убывания.
		list1.clear();
		list1.addAll(listFromArray);
		sort(list1);
		System.out.println("Отсортированные числа в порядке возрастания: "
				+ list1);
		reverse(list1);
		System.out
				.println("Отсортированные числа в порядке убывания: " + list1);

		// 10. Числа в порядке убывания частоты встречаемости чисел.
		for (Integer i : numbers) {
			put(i, frequency(listFromArray, i));
		}
		System.out.println("Числа в порядке убывания частоты встречаемости "
				+ "чисел <Число=Встречаемость>: " + revSortByVal(map));

		// 11. “Счастливые” числа.
		list1.clear();
		for (int i = 0; i < size; i++) {
			num = numbers[i].toString();
			if (num.length() == 4
					&& num.charAt(0) + num.charAt(1) == num.charAt(2)
							+ num.charAt(3))
				list1.add(numbers[i]);
		}
		System.out.println("“Счастливые” числа (&#931; 1-ой пары чисел "
				+ "= &#931; 2-ой пары): " + list1);

		// 12. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).
		list1.clear();
		for (int i = 2; i < size - 2; i++) {
			if (numbers.length < 3)
				break;
			else if (numbers[i + 2] == numbers[i] + numbers[i + 1])
				list1.add(numbers[i]);
		}
		System.out.println("Числа Фибоначчи: " + list1);

		// 13. Числа-палиндромы, значения которых в прямом и обратном порядке
		// совпадают.
		List<StringBuilder> palindromes = new LinkedList<StringBuilder>();
		for (int i = 0; i < size; i++) {
			StringBuilder s = new StringBuilder(numbers[i].toString());
			if (s.toString().equals(s.reverse().toString()))
				palindromes.add(s);
		}
		System.out.println("Числа-палиндромы: " + palindromes);

		// 14. Элементы, которые равны полусумме соседних элементов.
		list1.clear();
		Integer[] int2;
		int2 = numbers.clone();
		for (int i = 1; i < int2.length - 1; i++) {
			if (int2.length < 3)
				break;
			if (int2[i] == (int2[i - 1] + int2[i + 1]) / 2)
				list1.add(int2[i]);
		}
		System.out.println("Элементы, которые равны полусумме соседних "
				+ "элементов: " + list1);

		/**
		 * 15. Период десятичной дроби p = m/n для первых двух целых
		 * положительных чисел n и m, расположенных подряд.
		 * 
		 * @author RodionGork
		 */
		long p, q, r, l, t, i;
		for (int n = 0; n < size - 1; n++)
			if (numbers.length < 2)
				break;
			else if (numbers[n] >= 0 && numbers[n + 1] >= 0) {
				p = numbers[n];
				q = numbers[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;
			}

		// 16. Построить треугольник Паскаля для первого положительного числа.
		list1.clear();
		for (int u = 0; u < size; u++)
			if (numbers[u] >= 0) {
				list1.add(numbers[u]);
				System.out
						.print("Сколько строк треугольника Паскаля для числа "
								+ list1.get(0) + " отображать? ");
				int rows = in.nextInt();
				buildPascalTriangle(list1.get(0), rows);
			}
	}
}
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707197
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сам алгоритм я просмотрел через строку, но ничего криминального не заметил. Могу сказать, что в некоторых местах имя переменных и имена методов не совсем логичные или не отражают суть проблемы, например list1, list2, divider() и т.п. Так же разбил бы метод main на части соответствующие выполняемым функциям типа того -

Код: java
1.
2.
3.
4.
5.
6.
main(){
Integer[] sourceNumbers = readInput();
findEvenAndOddNumbers(sourceNumbers);
findMaxMinNumbers(sourceNumbers);
//и т.д.
}



Ну это так, чтоб совсем по-пацански было
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707203
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну еще тут у тебя косячок -
Код: java
1.
2.
List<Object> list = new LinkedList<Object>(map.entrySet());
		Map result = new LinkedHashMap();


Почему не используются generics? У тебя же всегда там Integer будет.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707206
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения лабораторной, если работает, то зачет.
С точки зрения комерческого программирования:
1. В if и for обязательно используйте {}, даже для одной строки. Скобки можно опустить только если тело блока находится в той же строке что и if/for
2. revSortByVal - используйте полноценные английские слова reverseSortingByValue - читается намного лучше.
3. revSortByVal - полный ахтунг в плане генериков. Integer превращается в Object и потом вообще generic типа почему-то пропадает.
4. bubbleRevSortByMod - почему ByMod когда ByAbs на самом деле?
5. gcd, lcm - зачем писать такие именна, чтобы потом объяснять в коментарии? greatestCommonDivisor() и всё. Либо getGCD, если GCD - общепринятое имя в проекте.
6. Русскоязычный текст может потерятся в процессе компиляции.
7. Переменным таким как list1, int2 нужно давать более осмысленые имена. Для long p, q, r, l, t, i;, возможно, тоже.
8. Всё написано в строго процедурном стиле, хотя свой объект на каждую задачу напрашивается. Отсюда и такой разброд в именах переменных.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707210
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и тут в принципе тоже, не то чтобы неправильно, но может привести к ошибке
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public static List<Integer> primeNums(Integer[] input) {
		list1.clear();
		for (Integer anInput : input) {
			if (isPrimeNum(anInput)) {
				list1.add(anInput);
			}
		}
		return list1;
	}



Лучше в каждом методе создавать свой List, а то рискуешь нарваться на неприятности, связанные с побочными эффектами.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707231
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсё написано в строго процедурном стиле, хотя свой объект на каждую задачу напрашивается.
Я не пурист абсолютного ООП, но мне кажется практичнее создать утилитный класс по подобию java.util.Math, вы не согласны?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707238
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЯ не пурист абсолютного ООП, но мне кажется практичнее создать утилитный класс по подобию java.util.Math, вы не согласны?
Проще, но не практичнее.
Здесь единый ввод, обработка данных списком задач и достаточно общий вывод. Можно было унифицировать. Ну и static поубирать везде, кроме утилитных методов.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707242
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Офигеть, сколько букв. Чета хочется убрать.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707287
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczС точки зрения комерческого программирования:
1. В if и for обязательно используйте {}, даже для одной строки. Скобки можно опустить только если тело блока находится в той же строке что и if/for...
Зачем??? Уже сколько сталкиваюсь с этой дилеммой, но ни одна из сторон внятного ответа не дала. На сайте Сана (или АйБиЭма - не помню) встречал рекомендацию не использовать фигурные скобки для одной строки. Так как и ранее не использовал, то это только придало уверенности, что я все-таки делаю правильно. А тут ты ... если бы твой авторитет не был столь высоким, то я бы просто прошел мимо, а так очень интересно услышать мнение - зачем.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707303
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы и divider упростил. Он существует только для того чтоб вернуть список который сушествует
только для того чтобы отработал toString. Так выведете сразу на консоль результат. Незачем
мусорить в куче.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707342
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И зачем LinkedList? Там сгодился-бы обычный ArrayList.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707530
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczесли тело блока находится в той же строке что и if/for
тут трудность в том, что я включаю автоформат...он строки делает.... не особо церемонясь.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707539
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz6. Русскоязычный текст может потерятся в процессе компиляции.??
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707600
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckЗачем??? Уже сколько сталкиваюсь с этой дилеммой, но ни одна из сторон внятного ответа не дала. На сайте Сана (или АйБиЭма - не помню) встречал рекомендацию не использовать фигурные скобки для одной строки. Так как и ранее не использовал, то это только придало уверенности, что я все-таки делаю правильно. А тут ты ... если бы твой авторитет не был столь высоким, то я бы просто прошел мимо, а так очень интересно услышать мнение - зачем.
В связи с тем как в Java принято ставить скобки, то для глаза нет разницы между такими блоками.
Код: java
1.
2.
3.
if(a == b || c == d || anotherLongObject.isInCondition()){
    doSomething();
    doSomethingElse();        


Код: java
1.
2.
3.
if(a == b || c == d || anotherLongObject.isInCondition())
    doSomething();
    doSomethingElse();        


Один девелопер не пишет скобку. Второй дописывает строку в тело условия. А она оказывается вне. Такую багу уже раза 3 встречал за последний год в legacy проекте.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707601
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123тут трудность в том, что я включаю автоформат...он строки делает.... не особо церемонясь.
Я всегда пишу скобки. Мне не трудно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707602
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowicz6. Русскоязычный текст может потерятся в процессе компиляции.??
IDE сохраняет в одной кодировке. Компилятор работает в другой. Зачастую они совпадают. Но могут и не совпасть.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707612
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ связи с тем как в Java принято ставить скобки, то для глаза нет разницы между такими блоками.
А еще беда если проект на нескольких языках - в одних есть скобки, в других нет, и такая бага чаще вылавливается(точнее происходит а потом вылавливается)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707613
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczIDE сохраняет в одной кодировке. Компилятор работает в другой
я так понял, если компилить во внешнем компиляторе без ide.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707615
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выходит, что скобки - "если кто-то невнимательный".
OK
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707616
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123выходит, что скобки - "если кто-то невнимательный".
OK

Это как в HTML не закрывать теги
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707623
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
не совсем:
- там можно не закрывать (парсер допускает ошибки)
- тут чисто вопрос корпоративной политики. Как внутри решили - так и будет.
Технических причин ставить скобки (begin ...end) я не увидел.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707626
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Технических причин ставить скобки (begin ...end) я не увидел.
А технические причины вообще разделять текст на строки, а не писать весь код в одну строку, видишь?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707630
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonPetro123Технических причин ставить скобки (begin ...end) я не увидел.
А технические причины вообще разделять текст на строки, а не писать весь код в одну строку, видишь?
а у нас так и принято :)
if aaaa else bbbbb
в строго оговорённых случаях, без маразма.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707640
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Edd.Dragonпропущено...

А технические причины вообще разделять текст на строки, а не писать весь код в одну строку, видишь?
а у нас так и принято :)
if aaaa else bbbbb
в строго оговорённых случаях, без маразма.
Вот в том то и дело. Что компилятору ни твои лишние пробелы, ни переводы строки не нужны. Но код ты ж не только для компилятора пишешь, удовлетворяя техническим требованиям, но и для чтения, удовлетворяя человеческим требованиям.

Никто не ищет причину, почему нельзя писать 10 if-ов в одну строку. И таки можно - на здоровье.

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


Кроме того, я в нескольких фирмах видел свои правила скобок.
В Java многое по другому. Это я в курсе.
авторМозг привык, при необходимости, добавлять новых строк под уже имеющиеся
Да, мностроковость кода - фирменная черта Java.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707654
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть ещё ньюанс.
При отладке (не сильно принято Java), при разных строках компилятор подсветит нужную строку :)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707659
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123есть ещё ньюанс.
При отладке (не сильно принято Java), при разных строках компилятор подсветит нужную строку :)
Не, когда в одну строку - это отдельный разговор. Речь об

Код: plaintext
1.
2.
if(isSomethingEnabled)
   SomethingDisable();



vs

Код: plaintext
1.
2.
3.
4.
if(isSomethingEnabled)
{
   SomethingDisable();
}
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707671
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,
если для компилятора они равнозначны, то я за 1-ый по субъективным причинам:
- очень не люблю длинный код
- аккуратно пишу с отступами
- думаю, если другой чел вставляя строку, не видит логику ветвления кода, то либо он не выспался, либо ошибся профессией.
imho
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707676
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор- очень не люблю длинный код
- аккуратно пишу с отступами
- думаю, если другой чел вставляя строку, не видит логику ветвления кода, то либо он не выспался, либо ошибся профессией.
imho

В таком случае для тебя должно быть нормально что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if(isSomethingEnabled) {
   SomethingDisable();
   SomethingDisable();
   SomethingDisable();
   SomethingDisable();
   SomethingDisable();
   SomethingDisable(); }

return WhatIsWrong();



Зачем последнюю скобку ставят отдельной строкой то?
А как я показал - даже не знаю, делают ли так хоть где-то? Не ведь логично - не плодить тупые строки. А по отступам все видно прекрасно.

Так что, нелогичностей можно найти всяких. В смысле, что на одну "нелогичность" можно парировать противоположной ))
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707701
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,
ты прав конечно. У меня там тоже нелогичность.
Открою тайну, я привык так писать, как меня научило IDE:
- написал слово class, нажал Ctrl+J и он сгенерировал код. Потом привык.
:-)
Но в разных фирмах видел по разному :(
Удачи!
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707703
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123я так понял, если компилить во внешнем компиляторе без ide.
ХЗ. За все IDE отвечасть сложно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707707
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- думаю, если другой чел вставляя строку, не видит логику ветвления кода, то либо он не выспался, либо ошибся профессией.
imho
Странно что ты сразу в байткоде не пишешь. И компактно. И скобки не нужны. И можно точно всем говорить что выбором профессии не ошибся. Я сам на этом спотыкался, как и другие мои коллеги. Придется идти в вахтеры. В программировании мне видать ничего не светит.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707724
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ сам на этом спотыкался, как и другие мои коллеги.
ну дак не каждый же день, чтобы молодого заставлять скобки ставить.
Я же сказал, это дело политики фирмы. Ты с этим не согласен что-ли.
У вас все ставят - и замечательно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707734
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123есть ещё ньюанс.
При отладке (не сильно принято Java), при разных строках компилятор подсветит нужную строку :)
Ты хочешь сказать, что отладка не сильно принята в java? Интересно услышить обоснование.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707736
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123BlazkowiczЯ сам на этом спотыкался, как и другие мои коллеги.
ну дак не каждый же день, чтобы молодого заставлять скобки ставить.

Ну-да, ну-да. Тот программист, из-за которого Маринер свалился, наверняка тоже что-то подобное считал.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707773
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, уже сколько лет пишу исключительно так: если одна строка в условии, то ее добавляю в конец условия, типа такого
Код: java
1.
2.
3.
4.
5.
6.
if (condition) expression();

if (condition) {
    expression1();
    expression2();
}


перепутать или просто дописать практически нереально.
Зато сколько строк "экономится" :) - целых 3!:
Код: java
1.
2.
3.
4.
if (condition)
{
    expression();
}


Фууу ...
Так как практический идентичный синтаксис в javascript и actionscript, то зачастую для эстетики перелопачиваю сотни строк кода ... ну ненавижу, когда мусор в коде.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707946
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, давайте не будем разводить холиваров на тему IDE и компиляторов.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37707996
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz4. bubbleRevSortByMod - почему ByMod когда ByAbs на самом деле?Ошибся. Логика была следующая: (abs)olute value = (mod)ulus = abs();
Забыл, что принято mod'ом называть сокращение: (mod)ulo = remainder = %;

maytonЯ бы и divider упростил. Он существует только для того чтоб вернуть список который сушествует
только для того чтобы отработал toString. Так выведете сразу на консоль результат. Незачем
мусорить в куче.divider, как и другие медоты, именно так и планировался - чтобы разделить алгоритм и отображение.

maytonИ зачем LinkedList? Там сгодился-бы обычный ArrayList.LinkedList использовал потому-что заранее неизвестен размер списка + напрямую ненужны методы ArrayList. Понимаю, что добавлять в середину списка (LinkedList) мне не нужно.

забыл ник, Blazkowicz, mayton спасибо за советы!
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708049
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу оформления кода и тп. - есть замечательный мануал: Code Conventions for the Java Programming Language http://www.oracle.com/technetwork/java/codeconv-138413.html
В соответствии с которым:
Code Conventions for the Java Programming LanguageNote: if statements always use braces {}. Avoid the following error-prone form:
Код: java
1.
2.
if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708169
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonНе, когда в одну строку - это отдельный разговор. Речь об

Код: plaintext
1.
2.
if(isSomethingEnabled)
   SomethingDisable();



vs

Код: plaintext
1.
2.
3.
4.
if(isSomethingEnabled)
{
   SomethingDisable();
}

в java принято что открывающая скобка стоит там же где и ключевое слово к которому оно относится. потому выбор между:

Код: plaintext
1.
2.
if(isSomethingEnabled)
   SomethingDisable();


vs
Код: plaintext
1.
2.
3.
if(isSomethingEnabled) {
   SomethingDisable();
}



разница в одну строку. для меня это не существенно.

плюс я пишу код в виде 1, а среда при форматировании кода добавляет скобки и приводит к 2. и удобно и не нужно лишний раз ставить {}.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708384
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже пишу однострочные if/for без скобок. упомянутая проблема с "дописал" если и не надуманная, то весьма редкая из-за автоформатирования, которое все равно перенесет по enter дописываемую строку влево на уровень if/for. так что актуально только для любителей блокнотов. как две строчки под if могут иметь одинаковое выравнивание без скобок от моего понимания ускользает.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708415
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaя тоже пишу однострочные if/for без скобок. упомянутая проблема с "дописал" если и не надуманная, то весьма редкая из-за автоформатирования, которое все равно перенесет по enter дописываемую строку влево на уровень if/for. так что актуально только для любителей блокнотов. как две строчки под if могут иметь одинаковое выравнивание без скобок от моего понимания ускользает.
Я так понял тут все работают в командах по 2-3 человека. С командами по 10-20 не сталкивались и проекты не аутсорсили?
Не все разрабочики одинково хорошо используют автоформат. У меня тут легаси проект с классом на 20.000 строк. Его пока отформатировать никто не пробовал. :)
Есть нормальная практика. Которая имеет под собой вескую причину. А тут каждый второй доказывает - "раз я такой умный девелопер, то я не должен писать хороший код. А те дураки что будут после меня сами виноваты."

Тогда можно и проверки на null не писать. Ведь все девелоперы умные. Они не допустят чтобы null значение бесконтрольно гуляло по системе. И вообще Coding Convention нивелировать за ненадобностью.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708433
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА тут каждый второй доказывает - "раз я такой умный девелопер, то я не должен писать хороший код. А те дураки что будут после меня сами виноваты."

Говорят, что самый пик по авариям у водителей приходится на второй год вождения. Когда опыта еще мало, но приходит ощущение уверенности. ПМСМ, желание не ставить операционные скобки после любого if имеет примерно такую же причину.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закрывающая скобочка несёт жёсткую смысловую нагрузку. Если её нет
и мы распечатали исходник на принтере с разрывом страницы между
if(..) и линией true, то создаётся устойчивое впечатление что
с новой страницы исполняется безусловный оператор. Не бог
весть какая несуразица но всё таки неприятно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708467
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТогда можно и проверки на null не писать
будь справедливым.
- проверки на null не имеют отношения к форматированию кода
- о легаси речи нет, т.к. форматировать его, дело ответственного "за это наследство"
Что тут спорить, если формат дело фирмы, я не понимаю. Был в 3-4 фирмах, и везде были свои порядки.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708474
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonскобочка жёсткую смысловую нагрузку
о как!
Кунсткамера:
"А у нас, у шефа, принтер формата А3. И он обязал всех делать скобки поправее к правому полю."
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А забудь проехали. Тема скобочек вобщем-то поднимается 2 раза в год.
Пофлудим. И разойдемся. Ничего с тех пор не изменилось.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708555
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- проверки на null не имеют отношения к форматированию кода

Это к вопросу отношения к качествку кода. Кому-то всё равно. Кому-то хочется чтобы его код всегда и везде стабильно работал и саппортился. Отсюда рекомендация. Вся контраргументация сводится к парадоксе "я не буду делать хорошо, потому что я умный".

Petro123Что тут спорить, если формат дело фирмы, я не понимаю. Был в 3-4 фирмах, и везде были свои порядки.
Это не дело фирмы. Это отношение к своей работы. Никакия фирма тебя не обяжет убирать скобки в if.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708568
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе все разрабочики одинково хорошо используют автоформат.
икнул. "авто" оно из греческого. переводится как "само по себе".

BlazkowiczТогда можно и проверки на null не писать
улыбнуло. доказали опасность венерических заболеваний на примере колупания пальцем в носу. еще бы известно что с пальцем сравнил.

BlazkowiczИ вообще Coding Convention нивелировать за ненадобностью.
convention это не догма, а максимум рекомендация или "джентльменское" соглашение. уже сразу второй и третий результат поиска в гугле на "java coding conventions if" выдает опусы, в которых запись без скобок допускается. например тут, пункт 72 :

авторIt is a common recommendation (Sun Java recommendation included) that brackets should always be used in all these cases. However, brackets are in general a language construct that groups several statements. Brackets are per definition superfluous on a single statement. A common argument against this syntax is that the code will break if an additional statement is added without also adding the brackets. In general however, code should never be written to accommodate for changes that might arise.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708571
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА забудь проехали. Тема скобочек вобщем-то поднимается 2 раза в год.
Пофлудим. И разойдемся. Ничего с тех пор не изменилось.
+5
у обоих сторон аргументы кончились.
Только ты тут привёл совсем неожиданный "ход конём" Респект.
Согласен, тема гроша не стоит, т.к. тот кому надо - выводы сделал.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708575
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvГоворят, что самый пик по авариям у водителей приходится на второй год вождения. Когда опыта еще мало, но приходит ощущение уверенности. ПМСМ, желание не ставить операционные скобки после любого if имеет примерно такую же причину.
приведением глупых аналогий можно доказывать что угодно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708589
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaикнул. "авто" оно из греческого. переводится как "само по себе".
Если оно автоматичнески форматирует, это ещё не значит что оно автоматически у всех используется.

chpashaулыбнуло. доказали опасность венерических заболеваний на примере колупания пальцем в носу. еще бы известно что с пальцем сравнил.
Ну, вы мастер аналогии. Мне такие вещи в скобках не перещатся.


chpashaconvention это не догма, а максимум рекомендация
Составленая опытными разработчиками с определенными целями.

chpashaили "джентльменское" соглашение.
Ещё раз доказывает что вы не работете в большой команде. У вас все "джентельмены" и друг другу доверяют писать как угодно. Вы это хотите сказать. Вам когда коллега предлагает code review провести - вы ему отвечаете , что у нас тут все джентельмены - верят друг другу на слово?

chpashaуже сразу второй и третий результат поиска в гугле на "java coding conventions if" выдает опусы, в которых запись без скобок допускается.
А зачем вы опусы анонимоусов читаете? Есть Sun/Oracle Coding Convention. Есть рекомендации от Google для Andriod - там на счет скобок всё тоже самое что я уже говорил выше.

chpashaIn general however, code should never be written to accommodate for changes that might arise.
Очевидно же, что это идиот писал. Либо фразе уже лет 20 с лишним, когда ещё не все осознали что код подвергается постоянным изменениям. Такие практики как Agile, XP, Scrum появляются только потому чтобы обеспечить процессы разработки при постоянном изменении требований. Тот кто заявляет, что код не должен писаться с оглядкой на возможные будущие изменения - либо junior, либо форменый кретин. Либо не имеет отношения к комерческому программированию.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708625
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczchpashaикнул. "авто" оно из греческого. переводится как "само по себе".
Если оно автоматичнески форматирует, это ещё не значит что оно автоматически у всех используется.
кто-то кодит с отключенными автоматическими отступами?


Blazkowiczchpashaулыбнуло. доказали опасность венерических заболеваний на примере колупания пальцем в носу. еще бы известно что с пальцем сравнил.
Ну, вы мастер аналогии. Мне такие вещи в скобках не перещатся.
а между тем ты именно ими оперируешь приводя в качестве аргументации сравнение с проверкой на NPE. как быть?

Blazkowiczchpashaconvention это не догма, а максимум рекомендация
Составленая опытными разработчиками с определенными целями.
не боги горшки обжигают. рекомендация остается рекомендацией. ей нельзя следовать бездумно.

BlazkowiczУ вас все "джентельмены" и друг другу доверяют писать как угодно.
ты опять путаешь божий дар с яичницей. под "джентльменским" подразумевается соглашение, которому все соглашаются следовать в целях унификации и стандартизации. скажем хочется моему коллеге кавычку с новой строки всегда ставить ala .net, я иду ему навстречу и мы закрепляем его стиль в качестве coding convention нашей конторы, хотя лично я имею другое предпочтение. обсуждаемый сабж из той же оперы. можно договориться как угодно. вред от не использования кавычек ничтожно мал.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708666
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати по поводу рекомендаций опытных товарищей

Код: java
1.
if (condition) statement; 



при отладке в принципе понять не возможно было вхождение или нет.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708675
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaкто-то кодит с отключенными автоматическими отступами?
Куча народу сами их расставляют. Если вы их не видели, это не значит что их нет.

chpashaа между тем ты именно ими оперируешь приводя в качестве аргументации сравнение с проверкой на NPE. как быть?
Это пример отношения. "Я делаю как хочу. То что вокруг много других людей меня не волнует. Те кто спотыкается на моей писанине - сами дураки, потому что не используют то, то и то." Возможно не самый удачный. Но вы с Petro123 оперируте именно этим странным подходом, заявляя что он лучше только потому что он не стандартый. Оригинально. Аргументировано. Спорить не с чем.

chpashaне боги горшки обжигают. рекомендация остается рекомендацией. ей нельзя следовать бездумно.
Т.е. вы обдумано и намерено не ставите скобок, чтобы те кто будет дальше суппортить код приучались пользоваться автоформатом?
Рекомендации имеют под собой аргументацию. У вас контраргментация субъективная. Есть объективные причины ставить скобки. У вас есть субъективные причины их не ставить.

chpashaты опять путаешь божий дар с яичницей. под "джентльменским" подразумевается соглашение, которому все соглашаются следовать в целях унификации и стандартизации. скажем хочется моему коллеге кавычку с новой строки всегда ставить ala .net, я иду ему навстречу и мы закрепляем его стиль в качестве coding convention нашей конторы, хотя лично я имею другое предпочтение. обсуждаемый сабж из той же оперы. можно договориться как угодно. вред от не использования кавычек ничтожно мал.
В Bitter Java в 9й главе хорошо написано для чего нужны соглашения. Почитайте, приведите мысли в порядок. А то уже и до кавычек докатились.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708678
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1

Я хорошенько отругал RStudio за практическую невозомжность отладки
кода написанного на его сверх-коротком языке. Но это уже ушло в
летописи и фольклор
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708681
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaкстати по поводу рекомендаций опытных товарищей
Код: java
1.
if (condition) statement; 


при отладке в принципе понять не возможно было вхождение или нет.
Правильно. Поэтому лучше так делать только в случаях break/return/continue. А ещё лучше ставить скобки.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708713
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и почему на собеседовании редко спрашивают: "каких религиозных взглядов по скобкам вы придерживаетесь?"
Или - "назовите стандарт скобок"
:)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708715
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczchpashaкто-то кодит с отключенными автоматическими отступами?
Куча народу сами их расставляют.
чем это обусловлено, если не секрет?

BlazkowiczЭто пример отношения. "Я делаю как хочу. То что вокруг много других людей меня не волнует. Те кто спотыкается на моей писанине - сами дураки, потому что не используют то, то и то."
нет, это пример спора в отрыве от контекста. есть правила не вызывающие сомнений в целесообразности, как проверка на null. их нельзя приводить в пример того, почему нужно следовать правилам, откровенно устаревшим или не имеющим под собой никакой твердой почвы.

Blazkowicz Возможно не самый удачный. Но вы с Petro123 оперируте именно этим странным подходом, заявляя что он лучше только потому что он не стандартый.
в каком месте я такое говорил? я лишь поставил под сомнение контр-аргумент, как откровенно надуманный и преувеличенный.

BlazkowiczРекомендации имеют под собой аргументацию. У вас контраргментация субъективная. Есть объективные причины ставить скобки. У вас есть субъективные причины их не ставить.
для утверждения об объективности чего-либо должно существовать некое измерение, ее подтверждающее. есть статистика совершения подобного рода ошибок?

BlazkowiczПочитайте, приведите мысли в порядок. А то уже и до кавычек докатились.
ну давай придираться к словам, чем не занятие, да? понятно, что я имел в виду фигурные скобки.


Blazkowiczchpashaкстати по поводу рекомендаций опытных товарищей
Код: java
1.
if (condition) statement; 


при отладке в принципе понять не возможно было вхождение или нет.
Правильно. Поэтому лучше так делать только в случаях break/return/continue. А ещё лучше ставить скобки.
а между тем в упомянутых тобою стилях кодирования андроида это выражение вполне легально

автораnd this is legal:
if (condition) body();
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708755
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВ Bitter Java в 9й главе хорошо написано для чего нужны соглашения.

авторyou can avoid this error and others like it by using a good editor that autoindents

дальше о том, что мы не знаем, что будет юзать заказчик и потому лучше перестраховаться.
соответственно у меня ровно один вопрос: книжка написана 10 лет назад, кто-то реально поддерживает код в редакторах без автоотступов?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708840
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо даже 1 строчку оборачивать в скобки : я сказал ;)
Blazkowicz привел достаточно веских аргументов,

Номер раз
Код: java
1.
2.
3.
if (stmt)
   f1();
   f2(); 



Номер два - код обязан быть МАКСИМАЛЬНО понятным , даже если на него смотришь вполглаза. Чем меньше деталей требует внимания, тем проще понимать чужой код. Это аксиома;)
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708867
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123и почему на собеседовании редко спрашивают: "каких религиозных взглядов по скобкам вы придерживаетесь?"
Или - "назовите стандарт скобок"
:)
Религиозный вопрос это где ставить открывающую скобку. Не ставить скобки с однострочным телом это уродование кода.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708880
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaчем это обусловлено, если не секрет?
Legacy кодом. Привычками. За всех ответить не могу.

chpashaя лишь поставил под сомнение контр-аргумент, как откровенно надуманный и преувеличенный.
Аргумент возможной ошибки без скобок вполне объективный. Как и ваш аргумент про отладку.
Аргумент про автоформатирование - субъективный, как и заявление о том что им все пользуются, а кто не пользуется, тот ошибся профессией. Это не объективно.

chpashaдля утверждения об объективности чего-либо должно существовать некое измерение, ее подтверждающее. есть статистика совершения подобного рода ошибок?
Я встречал 3-4 раза запоследние пару лет.

chpashaну давай придираться к словам, чем не занятие, да? понятно, что я имел в виду фигурные скобки.
Перенос открывающей скобки, это на вкус. Оборачивание тела в скобки это объективное улучшение качества кода.


chpashaа между тем в упомянутых тобою стилях кодирования андроида это выражение вполне легально
Поэтому я предлагаю ставить скобки всегда.

chpashaавтораnd this is legal:
if (condition) body();
Никто не мешает провалится в метод, чтобы увидеть отработало ли условие.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37708883
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе ставить скобки с однострочным телом это уродование кода.
Java - особый мир?
Или скрипт с особым синтаксисом?
Т.е. в Питоне это будет Эстетично. А в Java - уродство.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709011
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczchpashaчем это обусловлено, если не секрет?
Legacy кодом. Привычками. За всех ответить не могу.
извини, тут либо есть конкретное обоснование либо все домыслы. если человек поддерживает код в notepad-е, у него масса мест для косяков. какой legacy code не допускает использования autoindent? каким больным на голову надо быть, чтоб иметь привычку добавлять переносы и табуляцию вручную? почему бы тогда не отказаться от кучи инспекций, которые предоставляют современные IDE? рекомендации должны соответствовать окружающей действительности, а страховаться от наводнений в пустыне глупо.

BlazkowiczАргумент про автоформатирование - субъективный, как и заявление о том что им все пользуются, а кто не пользуется, тот ошибся профессией.
я попросил привести пример, когда это оправданно, потому что сам не могу привести ни одного аргумента в обоснование того, почему не используется autoindent. без этого апеллирование к возможности написать один метод под другим не более чем словоблудие. точно так же можно требовать, чтобы строки были не длиннее 80 символов на тот случай, если кто-то сидит за VGA-монитором. некоторые рекомендации должны адаптироваться к современным реалиям.

Blazkowiczchpashaдля утверждения об объективности чего-либо должно существовать некое измерение, ее подтверждающее. есть статистика совершения подобного рода ошибок?
Я встречал 3-4 раза запоследние пару лет.
я не припомню ни одного такого случая. в то время как NPE вовсе не редкость. что как-бы намекает, одни опасности реальны, другие слишком раздуты.


BlazkowiczОборачивание тела в скобки это объективное улучшение качества кода.
полезность этого улучшения весьма спорна, вполне на грани вкуса. иначе не было бы столько споров на столь "очевидную" тему.

Blazkowiczchpashaа между тем в упомянутых тобою стилях кодирования андроида это выражение вполне легально
Поэтому я предлагаю ставить скобки всегда.
а я всего лишь намекаю на то, что не все соглашения имеет смысл считать истиной в последней инстанции.

BlazkowiczНикто не мешает провалится в метод, чтобы увидеть отработало ли условие.
я думаю даже не стоит мусолить, почему это далеко не круто
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709015
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709027
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha к слову о птичках
Адоб вообще с головой не дружит. Это легко понять, во-первых заглянув в исходники Flex классов.

Во-вторых посмотрев, что одна голова не знает то что делает другая:
http://livedocs.adobe.com/flex/3/html/help.html?content=03_Language_and_Syntax_15.html However, Adobe recommends that you always use braces, because unexpected behavior can occur if statements are later added to a conditional statement that lacks braces.
Google, Sun\Oracle за скобки. Abobe не определился. Что там у MS?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709087
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczАдоб вообще с головой не дружит. Это легко понять, во-первых заглянув в исходники Flex классов.
согласен. но суть не в этом. имхо главный смысл coding conventions в унификации. т.е. не важно до чего договориться, главное определенность, о чем кстати многие и пишут. code conventions и близко не способны уберечь от самых главных и самых частых ошибок, которые происходят каждодневно.

BlazkowiczВо-вторых посмотрев, что одна голова не знает то что делает другая:
здесь ключевое слово "recommends". точно также, как в моей ссылке, они указывают на то, что

авторSome of these standards are completely arbitrary, since there is not always a “best way” to code. Nevertheless, in the interest of consistency

BlazkowiczGoogle, Sun\Oracle за скобки. Abobe не определился. Что там у MS?
Always use braces when optional.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709188
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczchpasha к слову о птичках
Адоб вообще с головой не дружит. Это легко понять, во-первых заглянув в исходники Flex классов.

+1 Flex хорошему дизайну или кодированию не научит.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709193
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaLeonidvГоворят, что самый пик по авариям у водителей приходится на второй год вождения. Когда опыта еще мало, но приходит ощущение уверенности. ПМСМ, желание не ставить операционные скобки после любого if имеет примерно такую же причину.
приведением глупых аналогий можно доказывать что угодно.
А я же не доказываю, что вам нужно делать. Я говорю, откуда у вас такое желание возникает. Почуствуйте разницу, если не увидели её в первом сообщении.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709231
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем: смотрим название топика - " Задачи на числа. Решение. Покритикуйте. (часть #1) " и пишем по теме.

За разговоры про coding conventions идем в соответствующий топик:
Code Conventions for the Java Programming Language
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709241
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidv Я говорю, откуда у вас такое желание возникает
да, ты меня без затей троллишь. второй год вождения и все такое, потерял страх и т.д. неужели в твою искушенную годами опыта голову не приходит, что подобные перлы ничего кроме флейма и перебранки не вызовут? ты нам может статистику упомянутой ошибки можешь предоставить? ну или хотя бы статистику отключения авто-отступов в современных IDE?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709259
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1st,
Извини брат, этот топик уже не твой. По теме тебе всё сказали. Дай людям отдохнуть.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709271
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Denis_m1st,
Извини брат, этот топик уже не твой. По теме тебе всё сказали. Дай людям отдохнуть.Нет ничего необратимого. Отдыхаем в другом месте, каком - см. выше.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37709281
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1st,
упрямый :).
Ты думаешь тебе что-то новое ещё скажут?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #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
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37751242
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДенис, ну вот скажи мне, а если у меня будет 100 целых чисел в качестве
второго аргумента ты будешь делать 100 блоков if (..) {} ?
Тогда, так:
Код: 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("Числа, которые делятся на " + Arrays.toString(args) + ": ");
	HashSet<Integer> uniqueNumbers = new HashSet<Integer>();
	if (args.length == 1) {
	    for (int sourceNumber : sourceNumbers) {
		if (sourceNumber % args[0] == 0) {
		    print(sourceNumber + ", ");
		}
	    }
	} else if (args.length == 2) {
	    for (int sourceNumber : sourceNumbers) {
		if ((sourceNumber % args[0] == 0 && sourceNumber % args[1] == 0)) {
		    print(sourceNumber + ", ");
		}
	    }
	} else if (args.length >= 3) {
	    for (int sourceNumber : sourceNumbers) {
		for (int i = 0; i < args.length - 1; i++)
		    for (int i2 = 2; i2 < args.length; i2++)
			if ((sourceNumber % args[i] == 0 && sourceNumber
				% args[i + 1] == 0)
				&& (sourceNumber % args[0] == 0 && sourceNumber
					% args[i2] == 0)) {
			    if (uniqueNumbers.add(sourceNumber)) {
				print(sourceNumber + ", ");
			    }
			}
	    }
	}
	println();
    }
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37754380
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код наиболее последней версии переехал сюда: http://ideone.com/a72cO
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37754417
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1st, еще не смотрел. Но общее впечатление могу
охарактеризовать одним словом.

Капец!
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37754483
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDenis_m1st, еще не смотрел. Но общее впечатление могу
охарактеризовать одним словом.

Капец!Капец - это хорошо или не очень?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37755235
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37756061
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе очень.Аргументируйте.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37756065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis_m1stmaytonНе очень.Аргументируйте.
У тебя есть модульный тест для функции findModNumbers(int[] sourceNumbers, int... args) ?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37756275
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ тебя есть модульный тест для функции findModNumbers(int[] sourceNumbers, int... args) ?Что вы подразумеваете под "модульным тестом"? JUnit тесты?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37756295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37758116
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, я не думаю, что в данном случае целесобразно писать юнит-тесты.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37758156
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... целесообразно чтобы написать другой код который будет компактнее твоего
протестировать и доказать эквивалетность двух исходников. Я и сам бы мог написать
Junit-тест но считаю что это ДОЛЖЕН сделать именно автор т.к. учесть краевые
моменты (null,аргументы, отрицательные, переполнения разрядной сетки)
можно только в тесте. На словах это описать нереально.

Далее будешь сам выбирать. Обычно здравый смысл подсказывает
что исходник который короче - поддерживать легче.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37758323
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... целесообразно чтобы написать другой код который будет компактнее твоего
протестировать и доказать эквивалетность двух исходников. Я и сам бы мог написать
Junit-тест но считаю что это ДОЛЖЕН сделать именно автор т.к. учесть краевые
моменты (null,аргументы, отрицательные, переполнения разрядной сетки)
можно только в тесте. На словах это описать нереально.

Далее будешь сам выбирать. Обычно здравый смысл подсказывает
что исходник который короче - поддерживать легче.Java, мягко говоря, не самый компактный язык и попытки добиться компактного кода могут привести лишь к потери времени и потери читаемости кода.
Насчет юнит-тестов, есть определенные случаи, когда они пишутся, а когда нет. Один из аргументов за то, чтобы не писать - это время, требуемое на их написание. Если оно превышает время на написание самого кода, что ожидаемо в данном случае, то это уже не целесообразно.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37758876
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не в том дело. У тебя логика местами дублируется.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37760013
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе в том дело. У тебя логика местами дублируется.В каких местах?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37760055
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая долгая дискуссия выходит. Может всё таки осилишь тест?
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37761322
Denis_m1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКакая долгая дискуссия выходит. Может всё таки осилишь тест?Если вы издалека начинаете. Тест ради теста - не осилю.
...
Рейтинг: 0 / 0
Задачи на числа. Решение. Покритикуйте. (часть #1)
    #37761334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно.
...
Рейтинг: 0 / 0
117 сообщений из 117, показаны все 5 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Задачи на числа. Решение. Покритикуйте. (часть #1)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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