我创建了一个程序,它总结了给定数据的所有可能的单个子字符串。例如: 1 1 2 2应该返回30,因为,
1
1 + 1
1 + 1 + 2
1 + 1 + 2 + 2
1
1 + 2
1 + 2 + 2
2
2 + 2
2
总结到30,现在问题不是创建这样的程序,问题是当大(10 ^ 15)个数字进来时可能有多达10 ^ 5个。现在我的问题是:我如何处理这些数字?我只能使用标准库,所以不幸的是我没有GMP,而且我也被迫在GCC 4.4.4上运行,这使得它更糟糕。
答案 0 :(得分:0)
我认为做一个UINT_128的裸骨(只是你需要的)很容易。 (你的最大答案实际上适合uint_96)
假设我知道你要实现程序的方式,你只需要构造函数来获取uint64_t;加法运算符;乘法运算符;可能是一个显示器。
我将其内部存储为4 uint32_t(单词),并且可以通过对单词进行操作来实现操作,同样地手动对小数进行加法或长乘法。乘法可以简化,因为我相信你的因素永远不会超过uint64_t所以你可以利用它。
如果你需要显示二进制或十六进制以外的东西,你可能也需要实现除法(或者如果你真的很懒,你可以通过数字二进制搜索样式猜测并且仅使用乘法检查来获得十进制表示。)
答案 1 :(得分:0)
对于任何有兴趣回答的人,我只是通过移动溢出数来分离无符号long long int。
for(int i = 1; i <= n; i++){
SUM += addends[i - 1] * (i * (n - i + 1));
if(SUM > 10000000000000000000){ // If close to overflow of unsigned long long int
SUM -= 10000000000000000000; // Remove 10^17
counter ++; // And boost counter, to make recreating true value possible
}
}
可能真的无效,但它对我的目的来说已经足够了。谢谢大家的帮助!