[英]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
循環將有效擦除num
中p
所有出現。 特別是在時間for
河段i
,我們有num
不再整除p
。 矛盾。 即在上面的循環中,如果滿足num % i == 0
,則i
為質數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.