Comments 31
Задача N 1.
1*d + 2*d +… + (n-1)*d + n*d = s*d, гд s — банальная сумма арифметической прогрессии, изучаемая в школе:
s = (1+n)*n/2
Значие n также находится простейшим вычислением.
Вывод: задача элементарно решается вообще без циклов.
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.
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 где-то ошибка, возможно, в ParseInt или при сравнении строк и чисел, не знаю JS. Проверил для одного лишнего числа 10548, где-то на 30 итерации получилось число 17858768886785871. В консоли Хрома это число не присваивается переменной, при присвоении получается 17858768886785872. Возможно, ошибка в этом.
У меня получился ответ 359, вот те 9 лишних чисел в вашем решении: [10548, 10794, 10828, 11538, 11784, 11818, 12528, 12774, 12808].
У меня получился ответ 359, вот те 9 лишних чисел в вашем решении: [10548, 10794, 10828, 11538, 11784, 11818, 12528, 12774, 12808].
залейте пожалуйста картинки на habrastorage.org, у меня они уже не грузятся в статье
В задаче №3 говорится про перестановку цифр чисел 2х и 3х, про цифры самого х ничего не сказано, так что предполагаю, что ответ 1782 (2*1782 = 3564, 3*1782 = 5346)
В задаче 3 формулировка вводит в заблуждение. Написано, что «числа 2*x, 3*x можно получить друг из друга перестановкой цифр». Однако, судя по решению, требуется найти натуральное x такое, что числа x, 2*x, 3*x можно получить друг из друга перестановкой цифр.
Немного не понял решение 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
3523014
3523014
Совсем не по теме:
Почему картинки не отображаются ни здесь, ни во многих других статьях? я что-то делаю не так?
Почему картинки не отображаются ни здесь, ни во многих других статьях? я что-то делаю не так?
Например, решение задачи 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.
Вот моя программа, которая не анализирует, а решает «в лоб»:
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.
Sign up to leave a comment.
Разбор задач первого этапа отбора в школу программистов HeadHunter 2016