Проект Эйлера № 5 | не могу понять решение

2520 — это наименьшее число, которое можно разделить на каждое из чисел от 1 до 10 без остатка.
Каково наименьшее положительное число, которое делится поровну (делится без остатка) на все числа от 1 до N?

Формат ввода:
Первая строка содержит T, который обозначает количество тестовых случаев. Далее следуют T строк, каждая из которых содержит целое число N.

Выходной формат :
Напечатайте требуемый ответ для каждого теста.

Ограничения:
1≤T≤10
1≤N≤40

полная ссылка на вопрос

Вот код, результаты которого были приняты hackerrank, но у меня возникли проблемы с пониманием решения.

Может кто-нибудь объяснить это?

что делает линия ans * = i / (ans% i) делать?
Остальное я понял.

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>

bool check_if_prime(long n);

int main(void) {
long t, n, i, ans = 1;
std::cin >> t;
while(t--){
std::cin >> n;
for(i = 2; i <= n; ++i){
if(!check_if_prime(i)){
if(ans % i)
ans *= i / (ans % i);
}else
ans *= i;
}
std::cout << ans << std::endl;
ans = 1;
}
return 0;
}

bool check_if_prime(long n){
if(n == 2)
return true;
for(long i = 2; i * i <= n; ++i){
if(n % i == 0)
return false;
}
return true;
}

-2

Решение

Приведенный выше код не дает правильного вывода для ряда тестовых случаев. Например:

    Output     N   Correct Answer
232792560  19  232792560
1059261584 23  5354228880
1117182544 25  26771144400
1886839328 27  80313433200

Вы можете проверить Фам Трунг ответить на аналогичный вопрос Я спросил.

3

Другие решения


По вопросам рекламы [email protected]