c++ 判断一个数是否为质数的函数
c++ function to check if a number is a prime
bool prime (long long int n) {
bool prime = 1;
if (n == 1) {
return 0;
}
else {
for (long long int i = 2; i <= n/2 ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
}
return prime;
}
}
这是我检查 n
是否为质数的函数。它一直有效,直到我尝试使用 12 位数字,例如 n = 999999999989.
这是为了problem on codeforces;当我提交此功能时,网站会打印“超出时间限制”。
您的代码的时间复杂度为 O(n/2) -> O(n)。
如果 n 是 10^12,则检查 n 的素数大约需要 10000 秒(给定 1 秒只能进行大约 10^8 次操作)。
for (long long int i = 2; i <= n/2 ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
这里的诀窍是你不需要检查 i 从 2 到 n/2。相反,您可以将它减少到 2 到 sqrt(n)。这是可行的,因为因为 sqrt(n) * sqrt(n) 是 n,所以不应该有任何 x 和 y 这样 x > sqrt(n); y > 开方(n); x*y = n。因此,如果 n 存在一个除数,它应该是 <= sqrt(n).
所以你应该把你的循环改成这样
for (long long int i = 2; i*i <= n ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
}
此代码的时间复杂度为 O(sqrt(n)),这对于 n 应该足够了
= 10^12.
P.S : sqrt(n) 表示 n
的平方根
bool prime (long long int n) {
bool prime = 1;
if (n == 1) {
return 0;
}
else {
for (long long int i = 2; i <= n/2 ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
}
return prime;
}
}
这是我检查 n
是否为质数的函数。它一直有效,直到我尝试使用 12 位数字,例如 n = 999999999989.
这是为了problem on codeforces;当我提交此功能时,网站会打印“超出时间限制”。
您的代码的时间复杂度为 O(n/2) -> O(n)。 如果 n 是 10^12,则检查 n 的素数大约需要 10000 秒(给定 1 秒只能进行大约 10^8 次操作)。
for (long long int i = 2; i <= n/2 ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
这里的诀窍是你不需要检查 i 从 2 到 n/2。相反,您可以将它减少到 2 到 sqrt(n)。这是可行的,因为因为 sqrt(n) * sqrt(n) 是 n,所以不应该有任何 x 和 y 这样 x > sqrt(n); y > 开方(n); x*y = n。因此,如果 n 存在一个除数,它应该是 <= sqrt(n).
所以你应该把你的循环改成这样
for (long long int i = 2; i*i <= n ; i++) {
if (n % i == 0) {
prime = 0;
break ;
}
}
此代码的时间复杂度为 O(sqrt(n)),这对于 n 应该足够了 = 10^12.
P.S : sqrt(n) 表示 n
的平方根