Я просто хочу, чтобы использовать некоторые уравнения, чтобы оценить эту вещь, а не оператор в модуль, так как программа должна давать результаты в течение 1 сек. Я попытался это counter=(((int)(N/A))+((int)(N/B)))-((int)(N/(A*B)));
, но он не для входа N = 200 A = 20 B = 8
Вы уже на правильном пути, ваша формула означает, что вы пытаетесь применить принцип включения-исключения.
(int) (N/A)
и (int) (N/B)
соответствуют пунктам целых чисел ≤ N
, которые делятся на A
и B
, соответственно.
Однако (int) (N/(A*B))
не дать вам правильное количество целых чисел ≤ N
которые являются Dividable обоими A
и B
.
На самом деле, вы должны заменить (int) (N/(A*B))
на (int) (N/lcm(A,B))
, чтобы получить правильный результат. Здесь lcm(A, B)
возвращает наименее общий кратный A
и B
.
Для реализации функции lcm(A, B)
, вы можете просто использовать следующую формулу:
lcm(A, B) = A * B/gcd(A, B);
где gcd(A, B)
возвращает наибольший общий делитель A
и B
, и он может быть эффективно вычислена Euclidean Algorithm, что неизбежно предполагает использование оператора модуля только в несколько раз (max {log(A), log(B)}
раз, если быть точным), поэтому не должно быть никаких проблем с производительностью для вас.
Это точно точка этой задачи, я думаю .. –
Кажется, что сито может помочь здесь, но трудно сказать, что лучше всего сработает для вас без вашего выделенного временного ограничения. –
Я просто хочу использовать какое-то уравнение для оценки этой вещи, а не оператора модуля, потому что программа должна давать результаты в течение 1 секунды. Я попытался использовать этот 'counter = (((int) (N/A)) + ((int) (N/B))) - ((int) (N/(A * B))); для входа N = 200 A = 20 B = 8 –