- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在 C++ 中实现除数求和算法,即
Let n = p1^a1 * p2^a2 * .... * pk^ak
Then
σ(n) = ( (p1^(a1+1) - 1) / (p1-1) ) * ( (p2^(a2+1) - 1) / (p2-1) ) * ... * ( (pk^(ak+1) - 1) / (pk-1) )
将因子插入 vector<int> p
的质数分解函数
void primeFactors(int n)
{
while (n%2 == 0)
{
p.push_back(2);
n = n/2;
}
for (ull i = 3; i <= sqrt(n); i = i+2)
{
while (n%i == 0)
{
p.push_back(i);
n = n/i;
}
}
if (n > 2)
p.push_back(n);
}
然后我创建一个 vector<int> p
的拷贝在 vector<int> pk
作为vector<int> pk(p)
并执行以下操作以在 p 中仅包含唯一元素。
auto it = unique(p.begin(),p.end());
p.resize(distance(p.begin(),it) );
现在最后根据公式求和:
for(int i=0;i<p.size();i++){
sum *= (pow(p[i],count(pk.begin(), pk.end(), p[i]))-1)/(p[i]-1);
}
上面的实现是错误的,因为我没有得到正确的输出。我在哪里犯了错误?他们是更好的实现方法吗?
最佳答案
计算结果的最后一个循环是 pi^ai
而不是 pi^(ai+1)
.将其更改为:
for (int i = 0; i < p.size(); i++){
sum *= (pow(p[i], count(pk.begin(), pk.end(), p[i]) + 1) - 1) / (p[i] - 1);
}
还有一件事,不是使用 vector 而是使用 unique
和 count
你可以简单地使用 map<int, int>
而不是在 O(n) 中获取每个素数的出现次数,而是像这样在 O(lgn) 中获取它:
void primeFactors(int n, map<int, int> &facs){
facs.clear();
for (long long p = 2; p*p <= n; p++){
while (n%p == 0){
facs[p] ++;
n /= p;
}
}
if (n > 1)
facs[n] = 1;
}
long long getRes(map<int, int> &facs){
long long t, res = 1;
for (auto it = facs.begin(); it != facs.end(); ++it){
t = pow(it->first, it->second + 1) - 1;
t /= (it->first - 1);
res *= t;
}
return res;
}
在上面的代码中我还使用了pow
计算结果的函数。我们可以通过在映射中存储功率值而不是计数来消除此函数,如下所示:
void primeFactors(int n, map<int, long long> &facs){
facs.clear();
for (long long p = 2; p*p <= n; p++){
while (n%p == 0){
if (facs.count(p))//this way we can save pi^(ai+1) instead of counting prime numbers
facs[p] *= p;
else
facs[p] = p*p;
n /= p;
}
}
if (n > 1)
facs[n] = n*n;
}
long long getRes(map<int, long long> &facs){
long long t, res = 1;
for (auto it = facs.begin(); it != facs.end(); ++it){
t = it->second - 1; //this is for pi^(ai+1)-1
t /= (it->first - 1);
res *= t;
}
return res;
}
关于c++ - c++中除数求和算法的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33321169/
我遇到了一个问题,想要了解更多信息以及如何避免。我有这个代码 len :: (Num r ) => [a] -> r len [] = 0 len xs = 1 + len ( tail xs ) a
我知道如何找到给定整数(1 除外)的除数: let smallest_divisor n = let rec aux n i = if i 编辑添加:在平均情况下,第二种方法
这个问题已经有答案了: Why does integer division code give the wrong answer? [duplicate] (4 个回答) 已关闭去年。 在 Java
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26). scala> 1.0 / Doub
我的数据帧结构如下,x_L 和 x_R 对的数量可能最多为 100。 ID Side A_L A_R B_L B_R 1 0 7 5 6 3 2
我的数据帧结构如下,x_L 和 x_R 对的数量可能最多为 100。 ID Side A_L A_R B_L B_R 1 0 7 5 6 3 2
如何使用转换将数字列表除以 2?我以为这段代码可以做到,但它只将整个列表的数字 1 除以 2,所以我一定完全误解了这一点。有人能帮助我吗? :) list v(5, 1); list d; d.res
我目前正在研究如何使用各种现代处理器的快速单精度浮点倒数功能来计算基于定点 Newton-Raphson 迭代的 64 位无符号整数除法的起始近似值。它需要尽可能准确地计算 264/除数,其中初始近似
我是一名优秀的程序员,十分优秀!