【问题标题】:std::map <int,int> incrementstd::map <int,int> 增量
【发布时间】:2013-12-25 08:26:31
【问题描述】:

我正在尝试编写一个函数,该函数将返回给定数字的素数分解(作为解决项目欧拉问题 #12 的一部分)。计算主要因素。我使用std::map。 代码如下:

#include "stdafx.h"
#include <iostream>
#include <map>
#include <algorithm>


bool IsPrime(unsigned int number)
{
    if (number < 1) return 0; // zero is not prime. For our purposes, one would be.
    for (unsigned int i = 2; i*i <= number; ++i)
    {
        if (number % i == 0)
            return false;
    }
    return true;
}


int divisors(unsigned int num)
{
    int orig_num = num;
    std::map <int, int> primefactors; 
    for(unsigned int i = 1; i <= num; ++i)
        if (num % i == 0 && IsPrime(i))
        {
            num /= i;
            ++primefactors[i];
            std::cout << primefactors[i] << "\t";
        }
    std::cout << orig_num << " = "; 
    for(auto& iter:primefactors)
         std::cout << iter.first <<  "^" << iter.second << " * ";
    return 0;   
}

int main()
{
    divisors(661500);
    return 0;
}

问题是primefactors 的所有计数都返回为 1,尽管main 中的数字被专门选择为大于 1 次幂的素数乘积 (661500 = 1^1*2^2 *3^3*5^3*7^2)。 我的猜测是我增加了一些错误。

【问题讨论】:

  • if (num % i == 0 &amp;&amp; IsPrime(i)) 应该是if (IsPrime(i)) while (num % i == 0)
  • @AntonKovalenko,为什么?

标签: c++ map increment


【解决方案1】:

每个素数只除一次。但只要数字能被它整除,你就应该继续除以质数:

for(unsigned int i = 2; i <= num; ++i)
        if (IsPrime(i))
        {
            while (num % i == 0) {
                num /= i;
                ++primefactors[i];
                std::cout << primefactors[i] << "\t";
            }
        }

其实不需要IsPrime(i)这个条件:

for(unsigned int i = 2; i <= num; ++i)
    while (num % i == 0) {
        num /= i;
        ++primefactors[i];
        std::cout << primefactors[i] << "\t";
    }

证明:如果i 不是质数,那么条件num % i == 0 意味着num 可以被i 的质数因子p 整除。但是p &lt; i 所以我们的循环必须在i 之前的某个时间通过p。并且while 循环将有效地删除pnum 中的所有出现。特别是当for 达到i 时,我们发现num 不再能被p 整除。矛盾。 IE。在上面的循环中,如果满足num % i == 0,则i 是素数。

【讨论】:

  • 试过了,结果只是无限期地输出数字。
  • @Chiffa 是的,我已经更新了代码。您应该从2 开始循环。顺便说一句:你正在做的事情非常低效。例如,根本不需要IsPrime(i) 条件。
  • 哦,这确实有帮助。谢谢。我想我只会将 1 视为代码另一部分的一个因素。
  • 为什么?我希望找到一个素因数分解,所以我检查我是否使用了素因数。
  • @Chiffa 我已经更新了答案。尝试删除它,看看会发生什么。老实说,这是埃拉托色尼筛法的一个版本。
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多