Палиндром

знаем, это свойство строки

let poly = 1234;
let ylop = 0;
let isPalindrome = false;
let polyString = String(poly);
ylop = Number(((polyString.split(’’)).reverse()).join(’’));
if (poly === ylop) {
isPalindrome = true;
}

Второй вариант
let polyString = String(poly);

for (i = polyString.length -1; i >= 0; i–) {
ylop += polyString[i];
ylop = Number(ylop)
}
if (poly === ylop) {
isPalindrome = true;
}

Выдумать другое решение, без использования всяких подсказок,не получилось. Как-то сразу стал думать в сторону строк, а не математического решения задачи. Вроде бы получилось сделать основываясь только на материале, который упоминался в курсе. Мой вариант решения:
let poly = 1221;
let ylop = 0;
let isPalindrome = false;
let i = poly;
while (i >= 1) {
ylop = ylop + String(i % 10);
i = String(parseInt(i/10));
}
if (ylop == poly) {
isPalindrome = true;
} else {
isPalindrome = false;
}`

Вот как-то так.

let poly = 5005;
let ylop = 0;
let isPalindrome = false;
let number = poly;

for (let i = 0; ylop < poly; i++) {
ylop = ylop * 10 + number % 10;
number = Math.floor(number / 10);
if(ylop === poly) {
!isPalindrome;
}
}

Я хз как Вы это сделали и чего Вам это стоило, но это великолепно. У меня чуть не вытек мозг, но к Вашему решению я и близко не пришел, авации. Хотя я и не понимаю что дает решение таких задач.

не работает

Сорян. Напортачил. Вот так надо:

let poly = 5005;
let ylop = 0;
let isPalindrome = false;
let number = poly;

for (let i = 0; ylop < poly; i++) {
ylop = ylop * 10 + number % 10;
number = Math.floor(number / 10);
if(ylop === poly) {
isPalindrome = true;
}
}

Вместо !isPalindrome;
нужно isPalindrome = true;

Но как-то странно, изначально у меня всё сработало.

Как регулярно пишут в рекламе Академии, “все ошибаются” и как известно " не ошибается лишь тот, кто ничего не делает", и те кто создает задания в процессе их решения и анализируя наши обсуждения вносят коррективы в алгоритмы проверки, и это не может не радовать.

1 лайк

Эту задачу проще всего решить с приведением типов, тк нет конкретного удобочитаемого способа как привести число в реверсивном порядке с использованием цикла (По крайней мере я его не нашел).

Мое решение:

let poly = 1221;
let ylop = '';
let isPalindrome = false;
let polyLength = 0;
let allNumbers = 1;

for (i = 1; i <= poly; i *= 10) {
  polyLength++;
} console.log('Длина числа - ' + polyLength);

for (i = 1; i <= polyLength; i++) {
  allNumbers *= 10;
  currentNumber = Math.floor(poly % allNumbers / allNumbers * 10);
  ylop += currentNumber + '';
} 
 
if (poly == ylop) {
  isPalindrome = true;
  console.log('число ' + poly + ' - палиндром.')
}

К сожалению, у меня не получилось решить эту задачу. Смотрел подсказку, но мне не ясна сама логика построения числа в обратном порядке.

// 3.Начинаем собирать число 505 задом наперёд
// 5 — остаток от деления
// 50 — результат деления 505 на 10
5 * 10 + 50 % 10 = 50;

Вот почему мы здесь остаток от деления (5) умножаем на 10 , а не , скажем на 100 ? Откуда вообще знаем что результат нужно сложить с остатком от деления на 10 числа 50 ? Есть какая-то общепринятая формула в программинге ? Или всё это получено опытным путём и известно только в узких кругах ?

Мое решение:

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

for (let i = poly; i >= 1; i /= 10){
  let tempNumber = Math.floor(i % 10);
  
  ylop = (ylop * 10) + tempNumber;
}

if (ylop === poly){
  isPalindrome = true;
}
3 лайка

let poly = 7997;
let ylop = 0;
let isPalindrome = false;
var arr = [];
var count = 0;
var number = poly;

while(number>1) {
arr[count] = Math.trunc(number%10);
number/=10;
count++;
}

while(count>0) {
count–;
ylop += arr[count];
ylop /=10;
}

count = arr.length;
while(count>0) {
count–;
ylop*=10;
}

ylop = Math.round(ylop);
console.log(ylop)

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

1.Находил остаток от 10-и.
2. Остаток конвертировал в символ.
3.Символ “приплюсовывал” к строке.
4.Делил число на 10 и округлял до минимального целого.
5.Проверял, “закончилось ли число”(temp===0)
let poly = 1221;
let ylop = 0;
let isPalindrome = false;
let flag=0;
let wordYlop="";
let temp = poly;

while(flag===0){
wordYlop+=(temp%10).toString();
temp=Math.floor(temp/10);
if(temp===0){
flag=1;
}
}

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

Отличный алгоритм. Я до такого не додумался. Пока смог только через перевод в строку.

Вы озвучили мои мысли.

У меня так получилось

let poly = 1221;
let ylop = 0;
let isPalindrome = false;
let number ;
let lastnumber = ‘’;
let quantity = 0;
let polylast;

let remains = 1;
let divider = 10;
while(remains >= 1){
remains = poly / divider;
quantity++;
if(remains >= 1){
divider *= 10;
}
}

polylast = poly;

for(let i = 1; i <= quantity; i++ )
{
number = poly % 10;
poly = poly / 10;
poly = Math.trunc(poly);
lastnumber = lastnumber + String(number)
}

ylop = Number(lastnumber);

if(ylop == polylast){
isPalindrome = true;
}

Наверняка, можно и лучше

let poly = 1221;
let ylop = 0;
let isPalindrome = false;
let initial = poly; 

for (poly; poly >= 1; poly = (poly - poly % 10) / 10) { 
  ylop = ylop *10 + poly % 10;
}

if (initial === ylop) {
  isPalindrome = true;
}
let poly = 1221;
let polyCopy = poly; // Копируем значение перменной poly т.к. она будет меняться
let ylop = ''; // вместо нуля делаем пустую строку
let isPalindrome = false;

while(poly) { //пока  Poly не равно нулю
// Получаем последнюю цифру числа
result = poly % 10;

//Преобразуем цифру в строку и добавим в перменную
ylop += String(result);

// Срезаем последнее число
poly = Math.floor(poly / 10);
};


if (polyCopy == ylop) { // используем не строгое равенство т.к. yolp - строка, а polyCopy - число
  isPalindrome = true;
}