为什么"% for loops"与求和算法相比内存成本相对较高?

Why is the "% for loops" comparably memory-expensive to the summation algorithm?

本文关键字:内存 相对 for loops 算法 求和 为什么      更新时间:2023-10-16

我一直在做C++编程,并在Hacker Rank中做了一些编程测验,特别是关于使用3和5的倍数的Project Euler++集成问题(第一个问题)。我试着用模(%)运算符做一个"蛮力"算法。但是,当我在论坛上阅读时,我收到了一个暂停,for循环中的%比应用求和算法要贵得多。


编辑【2015年12月23日】
---------------
我意识到我之前的问题"虽然两者都是蛮力,但模是如何以超时为代价增加内存的?"应该被视为一个空洞的问题,因为我没有意识到求和算法是一种蛮力算法。根据评论部分的摘要,不同的用户评论说,%绝对不是导致超时的原因,因为模运算符非常轻。根据用户Ishamael,我看到我的解决方案:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int T;
    cin >> T;
    int sum, num;
   for (int i = 0; i < T; i++) {
     sum = 0;
     num = 0;
     cin >> num;
     for (int j = 0; j < num; j++) {
        if ((j % 3 == 0) || (j % 5 == 0)) {
        sum += j;
        }
     }
     cout << sum << endl;
   }
  return 0;
 }

给我一个超时不是因为模运算符,而是因为嵌套的for循环。问题的底线是使用for循环作为算法的解决方案。

我向Quora(Razziman T.V.)的一位顶级程序员寻求帮助,他建议我如何使用论坛部分中提到的求和算法:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
   int T;
   cin >> T;
   long long sum, num;
        for (int i = 0; i < T; i++) {
         sum = 0;
         num = 0;
         cin >> num;
         if(num > 0) num = num - 1;
         long long n3 = floor(num / 3);
         long long n5 = floor(num / 5);
         long long n15 = floor(num / 15);
         sum = (n3 * (n3 + 1) / 2 * 3) + ((n5 * (n5 + 1) / 2) * 5)  -  ((n15 * (n15 + 1) / 2) * 15);    
               cout << sum << endl;
              return 0;
        }
  }

在这个解中,我们可以得到3…(从(3+6+9…[floor(n/3)*3]/3=1+2+3…floor(n/3))的倍数的总和。同样适用于5和15。将3和5的总和相加,再从15的总和中减去,以消除重复。不要忘记使用long-long,因为有些测试用例可能包含较大的数字大小。

快乐编码 :)

我想您谈论的是这个问题:

https://www.hackerrank.com/contests/projecteuler/challenges/euler001

如果是,请注意N等于10^9。黑客等级的解决方案预计会很快,这意味着它应该在几秒钟内完成。你的暴力解决方案很可能不会在2秒内完成——试着将其作为输入传递给1000000000,并测量它需要多少时间。

这个问题需要思考,并提出一个非常有效的解决方案(没有循环),而不是实现暴力方法。

外循环是多余的。我还删除了控制台阅读,因为它的使用不清楚。您可以对此进行修改以获得更通用的解决方案。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int T;
    T = 1000; // Can be replaced with cin >> T
    int sum;
    sum = 0;
    for (int j = 0; j < T; j++) {
        if ((j % 3 == 0) || (j % 5 == 0)) {
            sum += j;
        }
    }
    cout << sum << endl;
    return 0;
}