【发布时间】:2015-06-12 12:47:23
【问题描述】:
2520 是可以除以 1 到 10 的每个数字而没有任何余数的最小数字。 能被 1 到 N 的所有数整除(无余数)的最小正数是多少?
输入格式: 第一行包含 T,表示测试用例的数量。接下来是 T 行,每行包含一个整数 N。
输出格式: 打印每个测试用例所需的答案。
约束: 1≤T≤10 1≤N≤40
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;
}
【问题讨论】:
-
你的调试器可以。你问了吗?
-
它看起来非常简单明了。 什么你不明白?
-
ans % i 是 'ans' 和 'i' 的 GCD 吗? @nvoigt
-
@AneeshDandime 不,不是。
%运算符有据可查。您在使用哪种语言参考(如果有)时找不到它? -
@hvd ans *= i / (ans % i) 是做什么的?从逻辑上讲,它应该给出“ans”和“i”的 lcm 对吗?
标签: c++ c++11 greatest-common-divisor lcm