Палиндром


#22

Проблема, о которой я писал, никуда не делась. Каждый вызов функции будет неявно менять внешнее окружение
Пока не умеете пользоваться функциями - делайте согласно теории, которая дается здесь. Хотя если цель лишь бы решить - ок


#23

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

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

#24

Решение без цикла

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


#25

Вариант в 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}

А, выше было уже, с использованием функции округления в меньшую сторону получается красивее, но я ее не знал :slight_smile:


#27

Всё же без функций массивов не интересно :stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes:

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

isPalindrome = +poly.toString().split('').reverse().join('') === poly;

#28

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

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


#29

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

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


#30

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


#31

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


#32

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


#33

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

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


#34

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


#35

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


#36

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

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


#37

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


#38

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

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

#39

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


#40

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

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

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

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


#41

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

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}