簡體   English   中英

的std ::地圖 <int,int> 增量

[英]std::map <int,int> increment

我正在嘗試編寫一個函數,該函數將返回給定數的素數分解(作為解決項目歐拉問題#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;
}

問題是,盡管素數的main選擇是作為大於1冪的素數的乘積(661500 = 1 ^ 1 * 2 ^ 2 * 3 ^ 3 * 5 ^),但所有素數的primefactors都返回1。 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之前經過p一段時間。 while循環將有效擦除nump所有出現。 特別是在時間for河段i ,我們有num不再整除p 矛盾。 即在上面的循環中,如果滿足num % i == 0 ,則i為質數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM