C++除数使用循环进行编码

C++ divisors code with loops

本文关键字:编码 循环 C++      更新时间:2023-10-16

我在代码强制上遇到了一个问题,称为除数

我相信我已经解决了它,但它给了我一个时间限制超过的错误,所以我尽了最大努力使它更短,但仍然是相同的错误。

在这个问题上,我必须给出这个数应该有多少除数。

我的代码是:

#include <iostream>
using namespace std;
int main(){
    long long  t, x;
    int res = 2;
    cin >> t;
    for (int j = 0; j < t; j++){
        cin >> x;
        for (int i = 2; i <= x / 2; i++){
            if (x%i == 0){
                res++;
            }
        }
        cout << res << endl;
    }
    return 0;
}

示例输入应为:

3

12

7

36

输出应为:

6

2

9

您可以根据当前数字是奇数还是偶数,将内部循环(计算当前数字除数的循环)"拆分"为两种不同的情况:如果是奇数,则您只需要用奇数检查除法,从3开始。

无论如何,您可以通过只检查从2到floor(sqrt(x))的数字来进一步优化内部循环。如果一个数字x可被i整除,那么它也将被x / i整除,所以不检查从2到x / 2的数字,只查看(int) sqrt(x)(不一定需要强制转换sqrt的结果,因为iint)。

内部循环的代码可能如下所示:

for (int i = 2; i <= (int)sqrt(x); i++) {
    if (x % i == 0)
        res += 2;
}

首先您的代码:

#include<iostream>
using namespace std; // poluting namespace
int main(){
long long  t, x; // <------- EVIL use int64_t if that is what you want.
int res = 2; // is never reset is that your intent?
             // what if x == 1???
cin >> t;
for (int j = 0; j < t; j++){ // comparing an int32_t with an int64_t ...
    cin >> x; // stream has seldom been accused of being fast but is not likely to be the problem.
    for (int i = 2; i <= x / 2; i++){ // as already suggested stop at sqrt(x) or see below.
        if (x%i == 0){ // % is a costly operation.
            res++;
        }
    }
    cout << res << endl; // search for endl considered dangerous. use 'n' instead.
}
return 0;
}

编辑:删除了错误的代码。

因此,您可以从中使用的是不要使用std::endl,因为它在每次写入后都会刷新输出,而是使用'\n'。

我不认为您真的需要改进循环本身。你应该做的是利用数字的数学性质,特别是素数。你应该只循环到数字的平方根。(请参阅此问题:优化素数的计算)。

这是我使用平方根的代码版本:

#include <cmath>
#include <iostream>
using namespace std;
int main() {
    long long inputs;
    cin >> inputs;
    for(long long j = 0 ; j < inputs ; ++j) {
        int divisors = 2;
        long long current, maxdiv;
        cin >> current;
        maxdiv = sqrt(current);
        for(long long i = 2 ; i <= maxdiv ; ++i)
            if(current % i == 0)
                divisors += 2;
        // If the square root is a divisor, we added one divisor too many above.
        if(maxdiv * maxdiv == current)
            --divisors;
        cout << divisors << "n";
    }
    return 0;
}