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
的非常小的值,它只会更慢。