2011-01-23 22 views
0

素因数分解と一般的な因子で2つの数mとnのgcdを計算したい。 このようにする。例を取るM = 36、N = 48集合交差点

vector<int> factors1 = prime_factorization(m); // 2 2 3 3 
vector<int> factors2 = prime_factorization(n); // 2 2 2 2 3 
vector<int> intersection(10); 
set_intersection(factors1.begin(), factors1.end(), factors2.begin(), factors2.end(), intersection.begin()); 

交差点は今、この2 2 3 0 0 0 0 0 0 0である。私は、予めベクトルの大きさを設定する必要があります。残りの要素も0に設定されています。これは起こりたくありません。

これを行うより良い方法はありますか?セットなどを使用していますか?

また、ゼロを無視してstlを使用してベクトル交点(2 * 2 * 3)の要素の積を計算するにはどうすればよいですか?このようEuclid's algorithmとしてGCDを決定するためのより良い方法があること

vector<int> intersection; 
set_intersection(..., back_inserter(intersection)); 

注:

+1

このように設定していますか?ユークリッドのGCDアルゴリズムがこれにはるかに優れているからです。 –

+0

@Null set私はeuclidを知っていますが、異なる方法でgcdを計算したかっただけです。 –

+0

因子が主要な**力として表されている方が良いです。また、分解の後、素因数がソートされるので、intrsectionは計算がずっと簡単になります。 – ruslik

答えて

12

あなたはback-inserterを使用することができます。

5

Oliの答えは、あなたがそれを記述するときに状況に最も適しています。しかし、すでに存在していて、上書きしていた要素を持っているベクトルを使用していて、余分な数字を切り落としたければ、それを別の方法で行うことができます。 set_intersectionの戻り値を使用してベクトルメンバーeraseを呼び出すことによって:

intersection.erase(
    set_intersection(factors1.begin(), factors1.end(), factors2.begin(), factors2.end(), intersection.begin()), 
    intersection.end());