std::map <int,int> 增量

std::map <int,int> increment

本文关键字:int 增量 gt lt map std      更新时间:2023-10-16

>我正在尝试编写一个函数,该函数将返回给定数字的素因数分解(作为解决欧拉项目问题#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)。我的猜测是我正在增加错误的东西。

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

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 < i所以我们的循环必须在i之前经过一段时间pwhile循环将有效地消除num中所有p的发生。特别是当for达到i时,我们有了num不再能被p整除。矛盾。即在上面的循环中,如果满足num % i == 0,则i是素数。