Как стать автором
Обновить

Комментарии 31

Задача N 1.

1*d + 2*d +… + (n-1)*d + n*d = s*d, гд s — банальная сумма арифметической прогрессии, изучаемая в школе:

s = (1+n)*n/2

Значие n также находится простейшим вычислением.

Вывод: задача элементарно решается вообще без циклов.
Это было бы справедливо, если бы d не менялось на следующем витке.
Сумма квадратичной последовательности есть кубическая функция. Так что цикл всё равно не нужен, но формула будет чуть сложнее. Для нечётных size формула:

Sum = size * size * size * 2 / 3.0 + size * size / 2.0 + size * 4 / 3.0 - 1.5

Справедливо, «плюсую».
Можете описать, как вы пришли к этой формуле?
Я в свое время в школе нашел ее примерно следующими рассуждениями:
1. Понятно, что сумма квадратов — кубическая формула: S(n) = an^3 + bn^2 + cn + d.
2. Запишем систему уравнений для небольших n, чтобы найти a, b, c, d:
1 = a + b + c + d
5 = 8a + 4b + 2c + d
14 = 27a + 9b + 3c + d
30 = 64a + 16b + 4c + d
3. Решим, найдем a, b, c, d.
Добавил как альтернативное решение. Да, хотелось бы немного подробнее описание вывода формулы.
Искал коэф-ты «в лоб» — методом наименьших квадратов.
Задача 3: интересный факт, дроби n/7 имеют периоды (7-1) в десятичной записи и они получаются перестановкой цифр для разных n. Если не ошибаюсь, то же верно и для 17 с периодом (17-1). Короче, увлекающиеся подобной фигнёй решают эту задачу в уме.
Решал без непосредственных вычислений такую задачу в школьные годы: «Найти шестизначное число которое при умножении на 2, 3, 4, 5, 6 дает в результате шестизначное число записанное теми же цифрами что и исходное но в другом порядке.»
 N = 142857
2N = 285714
3N = 428571
4N = 571428
5N = 714285
6N = 857142
И это более правильный подход, в решении никак не используется ограничение на первую цифру (1-3) в вашем случае она детерминировано 1.
В решении сравниваются именно строчные значения, а не сами числа. Поэтому для гипотетического случая с 0 (далее числа выдуманы): для x = 123450 могли бы получить 2*x=254130 и 3*x=351240, где строчные значения всех этих чисел равны «012345».
for (var x=1, xSorted=''; x<=1000000; x++) — тут вы зачем проверяете число которое с 4 начинается? Если число х начинается с 4, то 3*x будет большей длины чем х и проверять этот случай смысла нет (даже такие случаи 4, 34, 334 и т.д.)
Согласен, спасибо. Т.к. 4 — частный случай для данных входных значений, добавил в решение расчет максимума первой цифры x. Т.е., например, для варианта 2*x, 4*x — xFirstMax уже будет 2, а для 3*x, 7*x — xFirstMax = 1.
В задаче 4 где-то ошибка, возможно, в ParseInt или при сравнении строк и чисел, не знаю JS. Проверил для одного лишнего числа 10548, где-то на 30 итерации получилось число 17858768886785871. В консоли Хрома это число не присваивается переменной, при присвоении получается 17858768886785872. Возможно, ошибка в этом.
У меня получился ответ 359, вот те 9 лишних чисел в вашем решении: [10548, 10794, 10828, 11538, 11784, 11818, 12528, 12774, 12808].
Спасибо. Действительно упустил момент.
Переписал решение для 4-ой задачи. Теперь суммируем не целые числа, а посимвольно строки — работает даже быстрее. Действительно, верный ответ 359.

залейте пожалуйста картинки на habrastorage.org, у меня они уже не грузятся в статье

Перезалил.
В задаче №3 говорится про перестановку цифр чисел 2х и 3х, про цифры самого х ничего не сказано, так что предполагаю, что ответ 1782 (2*1782 = 3564, 3*1782 = 5346)
В задаче 3 формулировка вводит в заблуждение. Написано, что «числа 2*x, 3*x можно получить друг из друга перестановкой цифр». Однако, судя по решению, требуется найти натуральное x такое, что числа x, 2*x, 3*x можно получить друг из друга перестановкой цифр.
Да, формулировка действительно странновата. Просто тогда не ясен смысл умножения на 2. Можно было бы тогда просто найти x, из которого надо получить число 1.5*х перестановкой цифр.
Немного не понял решение 6-ой задачи. Ведь если речь идет о последовательностях, то достаточно начать складывать все цифры числа — если на каком-то шаге у нас будет сумма больше 10 — то это не замечательное число, а если же на последнем шаге итерации у нас сумма 10 — то число замечательное.

foo = function(n) {
	n = n.toString();
	n = n.slice('');

	for(var i = 0, sum = 0; i<n.length; i++) {
		sum += parseFloat(n[i], 10);

		if(sum==10 && i == (n.length-1)) {
			return true;
		}

		if(sum>10) {
			return false;
		}

		else {
			if(sum==10) {
				sum = 0;
			}
		}
	}
	return false;
}
Сумма всех цифр числа, равная 10, — частный случай задачи, учитываемый в одном из этапов моего решения.
Обратите внимание на пример в самом задании. Последовательностью является не только та, что начинается с первой цифры:
3523014
3523014
3523014
Но ведь в замечательном числе все цифры являются частями последовательностей, разве я не прав?
Исходя из вашей логики, складывая последовательно цифры числа 3523014, получим 3 + 5 + 2 + 3… — уже на этом этапе получим 13, и число не попадет в список «замечательных», хотя верно обратное.
Все, понял. Спасибо.
Совсем не по теме:
Почему картинки не отображаются ни здесь, ни во многих других статьях? я что-то делаю не так?
Перезалил на habrastorage.org, однако у них сегодня ошибка 500 выдавалась.
Например, решение задачи 5 (остальные пока не смотрел) — не верно. Оно не учитывает сочетания степеней простых чисел, поэтому результат завышен.
Вот моя программа, которая не анализирует, а решает «в лоб»:

import java.math.BigInteger;
import java.util.LinkedList;

public class Task3 {
public static void main(String[] args) {
int minA = 3;
int maxA = 148;
int minB = 3;
int maxB = 120;
LinkedList numbers = new LinkedList<>();
for (int i = minA; i <= maxA; i++) {
for (int b = minB; b <= maxB; b++) {
BigInteger a = new BigInteger(String.valueOf(i));
a = a.pow(b);
if (!numbers.contains(a)) {
numbers.add(a);
}
}
}
System.out.println(numbers.size());
}
}

Да, не эффективно по ресурсам на вычисление, зато очень даже эффективно, чтобы понять, что 16529 — ответ не верный. Верный — 16355.

Шестая задача решена неверно. Правильный ответ — 45 285.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации