Палиндром

Только по циклам решал, без Math.floor

var poly = 444;
var ylop = 0;
var isPalindrome = false;
var number = poly;

while (poly >= 1) {
ylop = poly % 10 + ylop * 10;
if (Math.round(poly % 10) > 4) {
poly = Math.round(poly / 10) - 1;
} else {
poly = Math.round(poly / 10)
}
console.log(ylop);
}

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

если не хотите Math.floor, следовало тогда использовать toFixed и операции производить над number
а то получается вы затерли переменную и сравниваете с копией.

1 лайк

Почитала про строки. Если абстрагироваться от циклов, то toString, мне кажется, самый простой вариант:

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

poly = poly.toString();
ylop = poly.split('').reverse().join(''); 

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

console.log(isPalindrome);

В общем, из комментов оч много интересного можно почерпнуть))).

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

var ylop1 = ‘’
for (var i = 0; i < poly; i++){
var p = poly % 10;
poly = Math.trunc(poly / 10)
ylop1 += p

}
ylop = parseInt(ylop1, 10);
console.log(ylop)
if (poly === ylop){isPalindrome = true}
console.log (isPalindrome)

Не могу понять в чём ошибка, числа равны, условие соблюдается, а выдаёт всё равно false
P.S. Нашёл ошибку, но сообщение решил оставить, мало ли кому потом поможет…

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

var x = poly
var ylop1 = ‘’
for (var i = 0; i < x; i++){
var p = x % 10;
x = Math.trunc(x / 10)
ylop1 += p
}
if(x!=0){
ylop = ylop1 + x}
else {ylop = ylop1}
console.log(ylop)
if (poly == ylop){isPalindrome = true}
console.log (isPalindrome)

1 лайк

Предложу свой вариант. Тоже поломал голову, не хотелось использовать массивы, которые здесь просто напрашиваются. Исходил из того, что:

  1. .toString() - о нём уже рассказывалось в главе “Условия”
  2. Math.floor - уже достаточно много говорилось об этих функциях, и округлении, и квадратном корне, посчитал, что это подсказка - поискать, как округлить вниз.
  3. Подсказка в задании корявая, особенно когда начинают делить на 10 и получают целое число. Но это ещё ладно. А вот как собирать число - даже не стал вникать.
  4. С учётом % получается очень удачно: получаем последнюю цифру числа, плюсуем её в пустую строку (она становится первой), затем предпоследнюю - и делаем конкатенацию, она становится второй и т.д. - в итоге собирается инвертированное число.

var poly = 456;
var number = poly;
var ylop = ‘’;
var isPalindrome = false;

while(number > 0) {
var digit = (number % 10).toString();
ylop += digit;
number = Math.floor(number / 10);
}

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

P.S. Вставить форматированный код не получается, здесь всегда как-то по-дебильному работало форматирование, давно не был на этом форуме, уже забыл, как этого добиться

это лишнее. вы строку конкатенируете с числом, тут и так будет строка (поскольку при конкатенации вызывается метод .toString() на прототипе примитива самостоятельно).

тут хватит и нестрогого сравнения

Да, не заметил. За видео по форматированию - спасибо. Думал, что можно сначала нажать, а потом вставить код в выделенную область.

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

var count = 1;
var help = 1;
var number = poly;
var number1 = 0;
var number2 = 0;
var number3 = poly;
while(number>10){
count++;
number/=10;
}

for(var i = 1;i<count;i++){
help*=10;
}
while(help>0){
number1 = (number3%10)*help;
number3 = ~~(number3/10);
help/=10;
ylop+=number1;
}

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

Спасибо большое! У тебя уже есть место в раю

1 лайк

Что-то не так, а что именно- не понимаю. Прошу помощи!

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

var number=0;

while (poly>=1) {

   ylop+=(Math.floor(poly)%10)*10^number;//1+20+200+???
   
   number+=1;
          
   poly=poly/10;
         
 if (ylop===poly){
 
 isPalindrome===true;
 }
 
 }

:laughing:Сексуальный палиндром:

var poly = 1254368476598574;
var Poly = poly;
var ylop = 0;
var isPalindrome = false;

var N = 0;
while (Poly > 1) {
  Poly /= 10;
  N++;
}

for (var i=1;i<=N; i++) {
var ylop = ylop + (Math.floor((poly - (Math.floor(poly / Math.pow(10, i)) * Math.pow(10, i))) / Math.pow(10, i-1)) * Math.pow(10, N - i))
}

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

Решила сделать вот так:
var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var staticticPoly = poly;

function getlength(poly) {
return poly.toString().length;
}

var n = getlength(poly);

for (var i = 1; i < n; i++) {
if (poly >= 10) {
ylop += String(poly % 10);
poly = Math.floor(poly / 10);
console.log(ylop);
}
if (poly < 10 && poly >= 1) {
ylop += String(poly);
ylop = Number(ylop);
console.log(ylop);
}
}

poly = staticticPoly;

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

Пытаюсь понять как работают эти формулы:

ylop = ylop * 10 + polyCheck % 10;
polyCheck = (polyCheck - polyCheck % 10) / 10;

подставил значения:
итерация - 1:
ylop = 0 * 10 + 1221 % 10 = 122.1
polyCheck = (1221 - 1221 % 10) / 10 = 109.89

итерация - 2:
ylop = 122.1 * 10 + 109.89 % 10 = 1231.989
polyCheck = (109.89 - 109.89 % 10) / 10 = 10.879109

третью итерацию не считаю - какая-то хрень уже на второй происходит.
Подскажите, может не правильно что-то подставил?

вы разницу между делением и остатком от деления понимаете?

1 лайк

Решила при помощи конкатенации:

var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var str = "";
var polyCopy = poly;

while (polyCopy >= 1){
  var temp = polyCopy % 10;
  str += temp.toString();
  polyCopy = Math.floor(polyCopy / 10);
}
ylop = parseInt(str);
if (ylop === poly){
  isPalindrome = true;
  }

Предложил решение тут Палиндром
и тут Палиндром

Там два варианта. Первый с переводом в строку и с заведением сторонних переменных (что на мой взгляд не честно), и второй вариант - чистый (с стандартными переменными). Если администрация решит удалить мой ответ, я не против. Отсутствие ответа и готового решения заставляет думать своей головой.

Спасибо, благодаря тебе разобрался в этом задании.
У тебя самый понятный код.

Цикл for, и с вводом количества символов вручную

// Длина числа до 6 символов
for (i = 1, j = 6; j > 0; i++, j–) {

if(poly / 10j < 1) {
i = 0;
ylop = poly %10 * 10
(j-1)
}

ylop = ylop + ((poly - poly % 10j) / 10j) %10 * 10**(i-1);
}

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

и мой вариант до кучи
вроде бы в пределах уроков главы.

var poly = 1221;
var ylop = 0;
var isPalindrome = false;
var length = 0;
var ostatok = 0;
var desatok = 0;

for (var i = 1; poly / i >= 1; i *= 10) {length ++;}

for (var i=1, k=10; i<=length; i++, k*=10) {
desatok = (poly - ostatok)%k;
ostatok = ostatok + desatok%k;

for (var j=1, x=1; j<=(length-i); j++) { x*=10; }

ylop = ylop + desatok * x * 10/k;
}

if (ylop === poly) {var isPalindrome = true } else {var isPalindrome = false }

1 лайк

Почему вот ЭТО в подсказке ни у кого не вызывает вопросов?

// Уменьшаем изначальное число
505 / 10 = 50;
// 50 — результат деления 505 на 10