Палиндром

Магия toSring?! .reverse?! функции возведения в степень?! что это? зачем?
если этому не учили пользоваться в курсе?

PS Вопрос! Кто нибудь подскажет, почему при вычислении остатка от деления числа более 17ти знаков происходит ошибка вычисления во всех калькуляторах?

Для палиндрома “1234567890987654321” false.

PS Но само решение мне понравилось, коротко и по делу.

Ну да, подобные задачи положено решать через стринги, если по уму - потому что числовые решения рано или поздно упрутся в погрешности округления - не на 17 знаке, так на 37м. Вопрос в том, чтоб и авторам угодить (отработать спланированную ими программу обучения), и обойтись известными инструментами. Впрочем, после столкновения с парой задачек, в которых (без заглядывания на пару курсов вперед) совсем все грустно, теперь гуглю решения через 15 минут :frowning:

1 лайк

Здравствуйте, подскажите плз, в подсказке:
// 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;
}

И еще как вставлять сюда красивый код как в редакторе ? :slight_smile: Спасибо :slight_smile:

1 лайк

Для форматировании кода в сообщении есть кнопка </> на панели сверху

1 лайк

Вот мой вариант решения, использовал только то, что встречалось в курсах:

Решение
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, будем очень признательны за комментарии по этой теме!

7 лайков

мне кажется Гуглом можно пользоваться всегда и изобретать заново изобретенное - немного бессмысленно. только если есть желание потренировать свой ум в условиях больших ограничений.

deevtmb, очень красиво решили! браво! мне очень понравилось!

1 лайк

мой вариант решения:

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;}

1 лайк

Здравствуйте, у вас очень хорошее решение. Что вы имеете ввиду, что проверка не работает на таком числе?
Программа работает, код выполняется. Проверки подставляют зафиксированные значения для тестов, поэтому тоже всё работает.

Фух, помучился с заданием. Авторы наверно специально делают задачи, которые немного выходят за рамки учебного курса, чтобы у учащихся был навык искать решения не только в изученной теории, но и выходить за ее рамки, а также включать смекалку на максимум)

Вот такое решение получилось с использованием функций 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;
}
1 лайк

a9e669c05e262924b0fef5b5c597edbd 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}

идеальное решение в рамках программы курса 1%D0%B5%20%D0%BC%D0%B5%D1%81%D1%82%D0%BE%2040

4 лайка

d2c7dd1d39cd4ef3bb6a5bd8c9c978fc AleksBLG
Задача описанная в примере, не действенная. Я испытывал на большем количестве чисел. На трёх значных только некоторых, на четырёх значных вообще не работает.

Вместо примера задачи, в подсказку надо было написать: “используйте остаток от деления(ну если уж вообще упростить задание, то в подсказке указать )на десять”.

Ребята бы сами докопались до ответов.

И это было бы полезнее, чем сочинение различных вариаций уже описанного решения…

1 лайк

Вот мой способ решения

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;
}

1 лайк

Получилось вот так:

Код

var poly = 1221;
var ylop = 0;
var isPalindrome = false;

var s = poly;
while (ylop < poly) {
ylop = ylop + (s % 10);
if (ylop === poly) {
isPalindrome = true;
break;
}
s = Math.floor(s / 10);
ylop = ylop * 10;
}

У меня получилось 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;

var residue = 0;
var subtr = poly;

for (var i = 0; i < doString.length; i++) {
residue = subtr % 10;
subtr = subtr - residue;
subtr = subtr / 10;
ylop = ylop + residue;
}

if (Number(ylop) == poly) {
isPalindrome = true;
}

Второй вариант не очень нравится, т.к. все ломается если число начинается с нуля

если не использовать изящное решение через 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;
}
var poly = 1221;
var ylop = 0;
var isPalindrome = false;

var polyCheck = poly;

for (var i = 0; i <= String(poly).length; i++) {
  ylop += (poly % 10) * Math.pow(10,(String(poly).length - 1)); 
  poly = (poly - (poly % 10)) / 10;
}

ylop += poly;

if (ylop == polyCheck) {
 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; /*сравнение второго и 
предпоследнего, и т.д.*/
 }
} /*проверка останавливается, как 
только натыкается на первое 
несовпадение*/
1 лайк