2016-09-16 15 views
0

私はProject Eulerからno.5の問題を解決しようとしています。2520は1から10までの剰余を除いた数で割ることができる最小の数です。ベクトルの整数の繰り返しをチェックする方法は?

1から20までのすべての数値で均等に割り切れる最小の正の数値は何ですか。私は最初に1〜10の数を計算しようとしていますが、次に1〜20に移動します。 これは私のコードです:

#include <iostream> 
#include <vector> 
using namespace std; 

std::vector <int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

bool isPrime(unsigned int num) 
{ 
    if (num <= 2) 
     return true; 

    if ((num % 2) == 0) 
     return false; 

    unsigned sqr = (unsigned)sqrt(num); 
    for (unsigned i = 3; i <= sqr; i += 2) { 
     if (num % i == 0) 
      return false; 
    } 

    return true; 
} 

void LowestMultiple(vector<int> nums) { 
    for (vector< int>::iterator it = nums.begin(); it != nums.end(); it++) { 
     if (isPrime(*it)) { 
      cout << *it << endl; 
     } 
     else { 
      int m = *it; 
      int minit = *it; 
      std::vector<unsigned int> pfactors; 
      if (m % 2 == 0) { 
       do { 
        m /= 2; 
       } while (m % 2 == 0); 
       pfactors.push_back(2); 
      } 

      for (int i = 3; i <= m; i += 2) { 
       if (m % i == 0 && isPrime(i)) { 
        do { 
         m /= i; 
        } while (m % i == 0); 
        pfactors.push_back(i); 
       } 
      } 
      for (vector<unsigned int>::iterator it2 = pfactors.begin(); it2 !=  pfactors.end(); it2++) { 
       cout << minit << ":" << *it2 << endl; 
      } 
     } 
    } 


} 

int main() { 
    LowestMultiple(nums); 

    cin.get(); 
    return 0; 
} 

私は番号1〜10のすべての素因数を含むベクターを作成し、そして今、私はそれぞれの素因数をベクトルで繰り返される回数を見つける必要があり、その後、乗算LCMを得るために必要な回数だけ素因数を計算します。どうやってやるの?この問題を解決するためのより効率的なアルゴリズムがありますか?

+0

現在のコードは現在動作していますか?いいえ、それはどこで失敗するのですか?はいの場合は、改善のために[CodeReview](http://codereview.stackexchange.com/)を試してください。 –

+0

@FirstStepは動作しますが、さらに何をすべきかわかりません(ベクトル内の整数の繰り返しをチェックする方法)。 –

答えて

1

質問の結果は、2つの数字LCM(A、B)=(* b)は/ GCD(A、B)= GCDの[1,10]

LCMのLCMであります最大の共通の除数

typedef long long ll; 

ll gcd(ll a,ll b){ 
    if(!b) 
     return a; 
    else return gcd(b,a%b); 
} 

int main(){ 

    ll ans = 1,N= 10; 

    for(ll i = 2;i < N; ++i) 
     ans = (ans * i)/gcd(ans,i); 

    cout<<ans<<"\n";   
} 
+0

typedefとは何ですか? –

+0

gcd()は組み込み関数ですか? –

+0

** typedef **は、データ型のエイリアスを作成するために使用されます。 gcd()は組み込み関数ではありません。main()関数の上に書いてあります。 –

関連する問題