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
11798
Россия, Москва
Заменить операцию
Используется синтаксис 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
3133
Уфа
Деление в JS ещё ничего.
Главное — сложением не пользоваться :D

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


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

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


01/08/06
3133
Уфа
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, Супермодераторы



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

Сейчас этот форум просматривают: worm2


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

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