欧拉计划 #5 |看不懂解决办法
Project Euler #5 | can't understand solution
2520是能被1到10的每一个数整除而没有余数的最小数。
能被1到N的所有数整除(无余数整除)的最小正数是多少?
输入格式:
第一行包含 T,表示测试用例的数量。接下来是 T 行,每行包含一个整数 N.
输出格式:
打印每个测试用例所需的答案。
约束:
1≤T≤10
1≤N≤40
满link到question
这是代码,其结果已被 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;
}
以上代码没有为许多测试用例提供正确的输出。例如:
Output N Correct Answer
232792560 19 232792560
1059261584 23 5354228880
1117182544 25 26771144400
1886839328 27 80313433200
你可能想看看 Pham Trung's answer on a 我问过。
2520是能被1到10的每一个数整除而没有余数的最小数。 能被1到N的所有数整除(无余数整除)的最小正数是多少?
输入格式: 第一行包含 T,表示测试用例的数量。接下来是 T 行,每行包含一个整数 N.
输出格式: 打印每个测试用例所需的答案。
约束: 1≤T≤10 1≤N≤40
满link到question
这是代码,其结果已被 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;
}
以上代码没有为许多测试用例提供正确的输出。例如:
Output N Correct Answer
232792560 19 232792560
1059261584 23 5354228880
1117182544 25 26771144400
1886839328 27 80313433200
你可能想看看 Pham Trung's answer on a