Проблема, о которой я писал, никуда не делась. Каждый вызов функции будет неявно менять внешнее окружение
Пока не умеете пользоваться функциями - делайте согласно теории, которая дается здесь. Хотя если цель лишь бы решить - ок
Мой вариант. Правда я так понимаю, сверху уже было что-то подобное
for (var i = 1; poly / i >= 1; i *= 10) {
ylop += Math.floor(poly / i) % 10;
ylop = ylop.toString();
}
ylop = +ylop;
if (ylop === poly) {
isPalindrome = true;
}
Решение без цикла
var poly = 5568;
var ylop = 0;
var isPalindrome = false;
var first=Math.floor(poly/1000);
var secondOne=Math.floor(poly/100);
var secondTwo=secondOne%10;
var thirdOne=Math.floor(poly/10);
var thirdTwo=thirdOne%10;
var fourth=poly%Math.floor(poly/10);
if((first===fourth)&&(secondTwo===thirdTwo)){isPalindrome=true}
else{isPalindrome=false};
Вариант в 1 цикл БЕЗ использования неизвестных на данный момент команд типа math, reverse, массивов, строк и прочих тут упоминаемых:
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var polyCheck = poly;
while (polyCheck >=1)
{
ylop=ylop*10 + polyCheck%10;
polyCheck = (polyCheck - polyCheck%10) / 10;
}
if (poly === ylop) {isPalindrome = true}
А, выше было уже, с использованием функции округления в меньшую сторону получается красивее, но я ее не знал
Всё же без функций массивов не интересно
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
isPalindrome = +poly.toString().split('').reverse().join('') === poly;
Магия toSring?! .reverse?! функции возведения в степень?! что это? зачем?
если этому не учили пользоваться в курсе?
PS Вопрос! Кто нибудь подскажет, почему при вычислении остатка от деления числа более 17ти знаков происходит ошибка вычисления во всех калькуляторах?
Для палиндрома “1234567890987654321” false.
PS Но само решение мне понравилось, коротко и по делу.
Ну да, подобные задачи положено решать через стринги, если по уму - потому что числовые решения рано или поздно упрутся в погрешности округления - не на 17 знаке, так на 37м. Вопрос в том, чтоб и авторам угодить (отработать спланированную ими программу обучения), и обойтись известными инструментами. Впрочем, после столкновения с парой задачек, в которых (без заглядывания на пару курсов вперед) совсем все грустно, теперь гуглю решения через 15 минут
Здравствуйте, подскажите плз, в подсказке:
// 2.Уменьшаем изначальное число
505 / 10 = 50;
Как получается 50? ведь будет 50,5. Если использовать Math.round то не всегда будет корректно округлять. В чем подвох?
Не хотел смотреть подсказки, потратил часа 2 пытаясь сделать это задание. И все равно не получилось используя только прошедший материал. Использовал еще половину из Массивов. Получилось так:
var poly = 123;
var ylop = 0;
var isPalindrome = false;
var num=[];
var poly2=poly
for (var i= 0; poly2>0; i++) {
//заносит последнюю цифру "3" в массив
num[i] = poly2% 10;
//отнимает от числа остаток деления 123-3= 120
poly2-= poly2% 10;
//Делим на 10. 120 / 10 = 12.
poly2/=10;
//Следующая итерация:12 % 10 = 2 заносится цифра "2",
//12 - 2 =10,
//10/10 = 1,
//Далее: 1 % 10 = 1 заносится цифра "1",
//1- 1 = 0. Стоп
}
for (var j=0; j<num.length; j++) {
// склеивание данных массива в одну строку "321" и приведение ее в числовой формат.
ylop = parseInt(ylop + (num[j]).toString(),10);
}
if (poly===ylop) {
isPalindrome=true;
} else {
isPalindrome=false;
}
И еще как вставлять сюда красивый код как в редакторе ? Спасибо
Для форматировании кода в сообщении есть кнопка </> на панели сверху
Вот мой вариант решения, использовал только то, что встречалось в курсах:
Решение
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
for (var i = poly; i > 0; i /= 10) {
ylop+= i % 10;
if (i >= 10) {
ylop*= 10;
}
i-= i % 10;
}
if (poly === ylop) {
isPalindrome = true;
}
P.S. Задание далось очень непросто + не работает проверка на числе “1234567890987654321”.
Хотелось бы, чтобы Академия помогла с разбором этого задания. @GreenLera, будем очень признательны за комментарии по этой теме!
мне кажется Гуглом можно пользоваться всегда и изобретать заново изобретенное - немного бессмысленно. только если есть желание потренировать свой ум в условиях больших ограничений.
deevtmb, очень красиво решили! браво! мне очень понравилось!
мой вариант решения:
var poly = 13631;
var ylop = 0;
var isPalindrome = false;
var poly1=poly;
while (Math.trunc(poly1)>0){
ylop=ylop*10+poly1%10;
poly1=Math.trunc(poly1/10);
}
if (poly===ylop) {isPalindrome=true;}
Здравствуйте, у вас очень хорошее решение. Что вы имеете ввиду, что проверка не работает на таком числе?
Программа работает, код выполняется. Проверки подставляют зафиксированные значения для тестов, поэтому тоже всё работает.
Фух, помучился с заданием. Авторы наверно специально делают задачи, которые немного выходят за рамки учебного курса, чтобы у учащихся был навык искать решения не только в изученной теории, но и выходить за ее рамки, а также включать смекалку на максимум)
Вот такое решение получилось с использованием функций Math.floor (вариация округления Math.round)
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var a = poly;
while (a >= 1) {
ylop += a % 10;
ylop *= 10;
a = Math.floor(a / 10);
}
ylop /= 10;
if (ylop === poly) {
isPalindrome = true;
}
Но в целом можно решить даже и без нее:
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var a = poly;
while (a >= 1) {
ylop += a % 10;
ylop *= 10;
a = (a - a % 10)/ 10;
}
ylop /= 10;
if (ylop === poly) {
isPalindrome = true;
}
Gemini
Вариант в 1 цикл БЕЗ использования неизвестных на данный момент команд типа math, reverse, массивов, строк и прочих тут упоминаемых:
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var polyCheck = poly;
while (polyCheck >=1)
{
ylop=ylop*10 + polyCheck%10;
polyCheck = (polyCheck - polyCheck%10) / 10;
}
if (poly === ylop) {isPalindrome = true}
идеальное решение в рамках программы курса
AleksBLG
Задача описанная в примере, не действенная. Я испытывал на большем количестве чисел. На трёх значных только некоторых, на четырёх значных вообще не работает.
Вместо примера задачи, в подсказку надо было написать: “используйте остаток от деления(ну если уж вообще упростить задание, то в подсказке указать )на десять”.
Ребята бы сами докопались до ответов.
И это было бы полезнее, чем сочинение различных вариаций уже описанного решения…
Вот мой способ решения
var poly = 1221;
var ylop =0;
var isPalindrome = false;
var string = ‘’;
var del=poly;
for (var i =1; Math.ceil(del/10)>0; i++) {
var ost = del%10;
del = Math.floor(del/10);
string += ost;
}
ylop += Number(string);
if (poly == ylop) {
isPalindrome=true;
}
else {isPalindrome=false}
Вот такой код вышел у меня…
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var number = poly;
ylop = number % 10;
while (number > 0) {
number = (number - (number % 10)) / 10;
if (number === 0) {
break
} else {
ylop = ylop * 10 + number % 10;
}
}
if (ylop === poly) {
isPalindrome = true;
}