Ну да, подобные задачи положено решать через стринги, если по уму - потому что числовые решения рано или поздно упрутся в погрешности округления - не на 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, будем очень признательны за комментарии по этой теме!
мне кажется Гуглом можно пользоваться всегда и изобретать заново изобретенное - немного бессмысленно. только если есть желание потренировать свой ум в условиях больших ограничений.
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;
}
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}
У меня получилось 2 решения - одно полностью завязанное на String, другое на String + математика:
1.
var poly = 1221;
var doString = poly.toString();
var ylop = “”;
var isPalindrome = false;
for (var i = 0; i < doString.length; i++) {
ylop = doString.charAt(i) + ylop;
}
if (Number(ylop) === poly) {
isPalindrome = true;
}
var poly = 1221;
var doString = poly.toString();
var ylop = “”;
var isPalindrome = false;
если не использовать изящное решение через reverse, то вот он:
самый каеф
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
for (var i = 1; poly / i >= 1; i *= 10) { // счетчик 1, 10, 100, 1000 и т.д. пока результат деления больше 1, значит мы не достигли лимита разрядности poly и повторяем итерацию
ylop += Math.floor(poly / i) % 10; // math.floor обрезает число от остатка деления для захода на новую итерацию, а сам остаток вписываем в ylop
ylop = ylop.toString(); // тут вписываем в строку подряд остаток от деления
}
if (ylop == poly) { // используем нестрогое сравнение, т.к. ylop у нас сейчас строка
isPalindrome = true;
}
ylop = poly.toString();
var symbAmount=ylop.length;
var n=~~(symbAmount/2); /*Пробовал
math.round, но она округляет в
большую сторону*/
var b=-1;
for (var i=0; i<n; i++) {
if (i==0) {
if ( ylop.slice(i,(i+1)) == ylop.slice(b)) {
isPalindrome = true;
}else{isPalindrome=false;
break;/*сравнение первого и
последнего символов*/
}
}
else if (ylop.slice(i,(i+1))==ylop.slice((b-1),b)) {
b=b-1;
isPalindrome=true;
}else{isPalindrome=false;
break; /*сравнение второго и
предпоследнего, и т.д.*/
}
} /*проверка останавливается, как
только натыкается на первое
несовпадение*/