为什么"% for loops"与求和算法相比内存成本相对较高?
Why is the "% for loops" comparably memory-expensive to the summation algorithm?
我一直在做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;
}
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址
- 为什么"% for loops"与求和算法相比内存成本相对较高?
- 是C/ c++指针保持绝对内存地址,或相对于应用程序,或相对于模块