let getYears = function(start, end, amountNumbers) {
let years = [];
let bestYears = [];
// Создание массива с годами периода и перевод элементов массива в строку
for (let i = start; i <= end; i++) {
years.push(String(i));
}
// Обращение к i-тому элементу массива
for (let i = 0; i < years.length; i++) {
let oneYear = years[i];
let result = 0;
// Рассчёт суммы цифр i-того элемента
for (let j = 0; j < oneYear.length; j++) {
result += Number(oneYear[j]);
}
// Создание массива подходящих лет
if (result === amountNumbers) {
bestYears.push(Number(oneYear));
}
}
return bestYears;
};
Сделал похожим образом. Режет глаза ваше Number во вложенном цикле =)
моё рабочее
var getYears = function (start, final, summa) {
var olympYears = [];
for (var i = start; i <= final; i++) {
var yearsArray = i+[];
var sum = 0;
for (var j = 0; j < yearsArray.length; j++) {
sum += +(yearsArray[j]);
}
if (sum === summa) {
olympYears.push(i);
}
}
return olympYears;
};
На форуме нашел у кого-то решение с приведением к числу без методов, которое в курсе не преподавалось еще, заодно нашел статью про обфускацию в JS на Хабре: https://habr.com/post/312172/
в первом коде: а вторым циклом вы что перебираете (условие выхода из цикла)? а должны перебирать элементы строки yearStr.
второй код не имеет второго цикла по причине полового бессилия кодера: не 4х-значные годы он обработать не сможет, либо обработает с ошибкой
Решил все реализовав расчет суммы через дополнительную функцию. Как вам такой вариант?
var getSum=function (year){
var sum=0;
for (var i=1;i<=4;i++){
sum+=year%10;
year=Math.floor(year/10);
}
return sum;
}
var getYears=function (startYear,endYear,sumDays){
var dates=[];
for (var i=startYear; i<=endYear;i++){
if (getSum(i)==sumDays) {dates.push(i)};
}
return dates;
}
var getYears = function (startYear,
endYear, digAmount) {
var olimpicYears = [];
while (startYear <= endYear) {
var sum = 0;
var year = startYear;
while ((year/10)>1) {
sum += year%10;
year = Math.floor(year/10);
}
sum += year;
if (sum == digAmount) {
olimpicYears.push(startYear);
}
startYear++;
}
return olimpicYears;
}
var getYears = function (firstYear, lastYear, desiredYear) {
var olimpYears = [];
for (var i = firstYear; i <= lastYear; i ++) {
var yearString =String(i);
var yearSum = 0;
for (var j = 0; j < 4; j++) {
yearSum += Number(yearString[j]);
}
if (yearSum === desiredYear) {
olimpYears.push(i);
}
}
return olimpYears;
смотрите, внешний цикл перебирает числа в интервале от year1 до year2 включительно. с этим разобрались.
теперь берем конкретное число из этого списка.
нам надо перебрать его позиции и сложить значения каждой позиции. пусть число 1234 становится “как бы массивом” [1, 2, 3, 4]. и его мы перебираем используя метод .length (да-да, не удивляйтесь, об этом не принято говорить, но строка является как бы “склееным массивом”). а чтобы число 1234 стало строкой (читай “массив”), надо его привести, используя либо String(1234), либо чуть более изящно 1234+[] (кстати тут явно видно, что число стремится стать “массивом” и становится строкой).
для любопытных
можно извратиться еще больше и натурально сделать массив из числа, как это сделала Ineska: var arrYear = i.toString().split(''); и уже массив перебрать и получить сумму его элементов
а перебирая year2.length вы перебираете число. причем не рандомное из списка, а из ввода. а метод .length к нему не применим. ну если конечно при вызове функции вы конечно не зачитерите так: getYears(“1234”, “2345”, 12);
если хотите, выложите что у вас там неполучилось, поможем советом как поправить.
var getYears = function (x, y, z) {
var mass = [];
for (var i = x; i <= y; i++) {
var summ = 0;
for (var j = 0; j < i.toString().length; j++) {
var h = i.toString();
summ += parseInt(h[j], 10);
}
if (summ === z) {
mass.push(i);
}
}
return mass;
}
Вроде работает. Кто-нибудь из гуру гляньте пжл. Может можно оптимизировать?
Сводка
var getYears = function (yearBegin, yearEnd, sum) {
var array = [];
for (i=yearBegin; i<=yearEnd; i++) { //Перебираем годы
var year = String(i); //Переводим год из числа в строку
var sumOfDigits = 0; //Задаём переменную, где будем складывать цифры из года
for (j=0; j<=year.length-1; j++) { //Перепираем каждую цифру в году
sumOfDigits+=parseInt(year[j], 10);//Суммируем цифры в году
}
if (sumOfDigits == sum) {//Сравниваем сумму цифр в году с sum
array.push(i);//Если они равны, то добавляем этот год в массив
}
}
return array;
}