2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 15:06 
Аватара пользователя


01/12/11

8634
В одной из предыдущих тем, помимо всего прочего, обсуждалась операция

Используется синтаксис Javascript
a / b | 0;
 


, которую мне удалось использовать вместо "сишного" деления (как известно, в C деление производится с отбрасыванием дробной части).

Сегодня мне снова пришлось столкнуться с той же самой проблемой.

Вот процедура, получающая в качестве аргументов два целых числа (q и range) и вычисляющая наименьшее натуральное число в диапазоне от 1 до range, у которого произведение всех ненулевых цифр отличается от произведения всех ненулевых цифр следующего за ним числа ровно в q раз:

код: [ скачать ] [ спрятать ]
Используется синтаксис Javascript

function fun(q, range) {
for (let i = 0; i <= range; i++) {
         if((digProd(i)/digProd(i+1) | 0) == q || (digProd(i+1)/digProd(i) | 0) == q) {
             return i;
           }
         
         
    }
  return "No such number";
}

function digProd(n) {
       let p = 1;
       while (n > 0) {
       if (n % 10 != 0) {
             p *= n % 10;
             n = (n / 10 | 0);
            }
            else {
              n = (n / 10 | 0);}
         }
  return p;
       }

console.log(fun(54, 1000));
 


Вопрос №0:

Чем можно (и нужно!) заменить операцию
Используется синтаксис Javascript
a / b | 0;
 

?

Вопрос №1:

Какие критические замечания по поводу кода этой процедуры мне стоит принять к сведению (простым языком: сыпьте соль критику, не жалея (ни меня, ни соли)!)?

Заранее благодарю за ответы!

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 15:28 
Заслуженный участник


20/08/14
11060
Россия, Москва
Заменить операцию
Используется синтаксис Javascript
a / b | 0 == c
на
Используется синтаксис Javascript
a == c * b
тут все числа целые и операции выполняются точно.

-- 12.07.2018, 15:32 --

Ещё ветка else в if внутри while лишняя, операцию деления на 10 можно вообще вынести из if, она же идентична в обоих ветвях if.

-- 12.07.2018, 15:35 --

Ну и про дизайн: отступы некрасивы и неадекватное расположение закрывающих }, это заметно затрудняет анализ кода (лично я пересохраняю текст в файл, выравниваю и отступы и блоки и лишь тогда смотрю код). У Вас это постоянно. :-(

-- 12.07.2018, 15:39 --

И если совсем уж озаботиться оптимизацией вычислений в ущерб понятности кода, то в цикле перебора i можно вычислять только один раз новое значение digProd(i+1), а digProd(i) брать из переменной. И сравнивать не функции, а две переменные. Это мог бы сделать и компилятор, но лично у меня на него в таком случае надежды мало. Повторю, это личный выбор баланса между понятностью кода и скоростью вычислений. Имею в виду примерно такой код, смотрите насколько (не)понятнее:
Используется синтаксис Javascript
function fun(q, range) {
let a = digProd(0); let b = 0;
        for (let i = 1; i <= range; i++) {
                b = digProd(i + 1);
                if (a == q * b || b == q * a) return i;
                a = b;
        }
        return "No such number";
}

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 15:44 
Заслуженный участник
Аватара пользователя


01/08/06
3049
Уфа
Деление в JS ещё ничего.
Главное — сложением не пользоваться :D

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 16:00 
Заслуженный участник


20/08/14
11060
Россия, Москва
Ktina
Вместо b|0 с успехом можно и нужно пользоваться https://javascript.ru/Math.floor (их там целая куча полезных). Оно может даже не будет ограничено 32-мя битами (не знаю) ...

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 16:33 
Аватара пользователя


01/12/11

8634
Dmitriy40
Большое спасибо!

-- 12.07.2018, 16:33 --

worm2 в сообщении #1326246 писал(а):
Деление в JS ещё ничего.
Главное — сложением не пользоваться :D

Это ещё почему?

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 16:38 
Заслуженный участник


20/08/14
11060
Россия, Москва
Ktina в сообщении #1326254 писал(а):
Это ещё почему?
Потому что не всегда понятно (особенно начинающему) когда будет использовано арифметическое сложение, а когда конкатенация строк (и кажется это даже зависит от содержимого операндов, т.е. не всегда ясно лишь из синтаксиса, Вы к примеру можете на такое наткнуться со своей функцией fun(), возвращающей или число, или строку) - а результат существенно разный.

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 16:41 
Заслуженный участник
Аватара пользователя


01/08/06
3049
Уфа
Ktina писал(а):
Это ещё почему?
https://dxdy.ru/post1201153.html#p1201153

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 17:50 
Аватара пользователя


07/01/13
261
NJ
Dmitriy40 в сообщении #1326249 писал(а):
Ktina
Вместо b|0 с успехом можно и нужно пользоваться https://javascript.ru/Math.floor (их там целая куча полезных). Оно может даже не будет ограничено 32-мя битами (не знаю) ...

Точно не будет.

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 22:43 
Аватара пользователя


01/12/11

8634
Странно, что самой главной ошибки никто так и не заметил. И я поначалу тоже.

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 23:12 


05/09/12
2587
Ktina в сообщении #1326366 писал(а):
Странно, что самой главной ошибки никто так и не заметил. И я поначалу тоже.

Что выбрали javascript? Да, понимание этой ошибки приходит не сразу, вы еще достаточно быстро догадались.

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение12.07.2018, 23:35 
Аватара пользователя


01/12/11

8634
_Ivana в сообщении #1326368 писал(а):
Что выбрали javascript? Да, понимание этой ошибки приходит не сразу, вы еще достаточно быстро догадались.

Поправьте меня, если я ошибаюсь. Все языки программирования равносильны по Тьюрингу.
Нет, я о другой ошибке. Что выдаст процедура, скажем, при $q=7$?

 Профиль  
                  
 
 Re: JS, отбрасывание дробной части при делении и прочие моменты
Сообщение13.07.2018, 10:28 
Заслуженный участник


27/04/09
28128
Ktina в сообщении #1326373 писал(а):
Все языки программирования равносильны по Тьюрингу.
Или «имеют равную вычислительную силу», или «полны по Тьюрингу», но ни то, ни другое не верно в общем случае, хотя верно для языков, которые используются на практике (и с точностью до ограничений архитектуры — например, ассемблеры микроконтроллеров с фиксированным объёмом памяти заведомо не тьюринг-полны). Так что в общем вы правы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group