Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法减少这段代码的执行时间?_C++_Numbers_Time Complexity - Fatal编程技术网

C++ 有没有办法减少这段代码的执行时间?

C++ 有没有办法减少这段代码的执行时间?,c++,numbers,time-complexity,C++,Numbers,Time Complexity,我试图求一个给定数的所有除数之和 但是我超过了时间限制,请帮我缩短此代码的时间限制 int a,count=0; cin>>a; for(int i=2;i<=a/2;i++) { if(a%i==0) { count=count+i; } } count++; cout<<count; int a,计数=0; cin>>a; 对于(inti=2;i你可以让循环运行到sqrt(a),而不是a/2,如果你想在某个时间对两个除数求和:c

我试图求一个给定数的所有除数之和 但是我超过了时间限制,请帮我缩短此代码的时间限制

int a,count=0;
cin>>a;
for(int i=2;i<=a/2;i++) {
    if(a%i==0) {
        count=count+i;
    }
}
count++;
cout<<count;
int a,计数=0;
cin>>a;

对于(inti=2;i你可以让循环运行到
sqrt(a)
,而不是
a/2
,如果你想在某个时间对两个除数求和:
count+=i+a/i

你可以让循环运行到
sqrt(a)
,而不是
a/2
,如果你想在某个时间对两个除数求和:
count+=i+a/i
我想说,可以让循环运行到sqrt(a)
。每次有余数0时,请同时添加i和a/i。您将需要处理角落案例,但这将降低时间复杂性。根据a的大小,这应该更快。对于较小的值,这实际上可能会更慢。

我想说,转到sqrt(a)。每次有余数0时,请同时添加i和a/i。您需要处理角点情况,但这会降低时间复杂性。根据a的大小,这应该更快。对于较小的值,这实际上可能会更慢。

此问题可以通过素因子分解进行优化

Let’s assume any number’s prime factor is = a ^n*b^m*c^k
Then, Total number of devisors will be = (n+1)(m+1)(k+1)
And sum of divisors = (a^(n+1) -1 )/(a-1)  *  (b^(m+1)-1)/(b-1) *(c^(k+1)-1)/(c-1)
X = 10 = 2^1 * 5^1
Total number of devisors = (1+1)(1+1) =2*2= 4
Sum of divisors  = (2^2 – 1 ) /1 * (5^2 -1 )/4 =  3 * 24/4  =  18
1+2+5+10 = 18 

这个问题可以通过素因子分解来优化

Let’s assume any number’s prime factor is = a ^n*b^m*c^k
Then, Total number of devisors will be = (n+1)(m+1)(k+1)
And sum of divisors = (a^(n+1) -1 )/(a-1)  *  (b^(m+1)-1)/(b-1) *(c^(k+1)-1)/(c-1)
X = 10 = 2^1 * 5^1
Total number of devisors = (1+1)(1+1) =2*2= 4
Sum of divisors  = (2^2 – 1 ) /1 * (5^2 -1 )/4 =  3 * 24/4  =  18
1+2+5+10 = 18 

谢谢大家的帮助我得到了答案

     bool  is_perfect_square(int n) 
     {
     if (n < 0)
     return false;
     int root(round(sqrt(n)));
     return n == root * root;
     }
     main()
     {
     int t;
     cin>>t;
     while(t--)
    {
    int a,count=0;
    cin>>a;
    bool c=is_perfect_square(a);


    for(int i=2;i<=sqrt(a);i++)
    {
        if(a%i==0)
        {
            count=count+i+a/i;

        }

    }
    if(c==true)
    {
                count = count - sqrt(a);
    }
    count++;
    cout<<count<<endl;
    }


}
bool是完美的正方形(int n)
{
if(n<0)
返回false;
整数根(圆形(sqrt(n));
返回n==根*根;
}
main()
{
int t;
cin>>t;
而(t--)
{
int a,计数=0;
cin>>a;
bool c=完全平方(a);

谢谢大家的帮助,我得到了答案

     bool  is_perfect_square(int n) 
     {
     if (n < 0)
     return false;
     int root(round(sqrt(n)));
     return n == root * root;
     }
     main()
     {
     int t;
     cin>>t;
     while(t--)
    {
    int a,count=0;
    cin>>a;
    bool c=is_perfect_square(a);


    for(int i=2;i<=sqrt(a);i++)
    {
        if(a%i==0)
        {
            count=count+i+a/i;

        }

    }
    if(c==true)
    {
                count = count - sqrt(a);
    }
    count++;
    cout<<count<<endl;
    }


}
bool是完美的正方形(int n)
{
if(n<0)
返回false;
整数根(圆形(sqrt(n));
返回n==根*根;
}
main()
{
int t;
cin>>t;
而(t--)
{
int a,计数=0;
cin>>a;
bool c=完全平方(a);


对于(int i=2;我想减少时间复杂度,还是减少执行时间?它们是完全不同的东西。TLE通常意味着你想减少执行时间,而不是时间复杂度。好吧,那么,我想减少执行时间…有什么办法吗?…正如我提到的,这段代码计算的是ta数的所有除数之和ken as Input您对
a
的值有什么假设吗?在这里使用多线程可能会很有用。您可以用速度换取空间,使用缓存或预先计算的值。如果您可以摆脱
If
语句并将该逻辑合并到
count=count+i
部分,您将避免分支-预测失败。你想减少时间复杂度还是执行时间?它们是完全不同的东西。TLE通常意味着你想减少执行时间,而不是时间复杂度。好吧,那么,我想减少执行时间…有什么办法吗?…正如我提到的,这段代码计算数字w的所有除数之和你对
a
的值有什么假设吗?也许在这里使用多线程会很有用。你可以用速度换取空间,使用缓存或预先计算的值。如果你能摆脱
If
语句,并将该逻辑合并到
count=count+i
部分,你将oid分支预测失败。为什么会更慢?因为您可能有额外的角大小写检查,例如a是一个完美的正方形,所以您不想计算除数和商(a=4将导致现有代码为2,并且可能导致4,除非您有一个检查来计算一次。)这个额外的检查需要额外的时间,但我不认为你会注意到差异。转角情况会是什么?@Imran:啊,我明白了。但是你保存了几个模,只要
a>4
,所以只有非常小的
a
值才会慢。为什么会慢一些?因为你可能有额外的转角情况检查例如a是一个完美的正方形,因此您不想计算除数和商(a=4将导致现有代码为2,并且可能导致4,除非您有一个检查来计算一次。)这个额外的检查需要额外的时间,但我不认为你会注意到差异。会有什么不同的情况?@Imran:啊,我明白了。但是你保存了几个模,只要
a>4
,所以对于
a
的非常小的值,它只会更慢。