2016-08-08 9 views
0

OEISでsequence of interestが見つかりました。私が取り組んでいるプログラミング競争解決のためにC++で同じシーケンスを生成したいと思います。PARIプログラムをC++に変換

しかし、私はシーケンスページで与えられたプログラムの仕組みを理解しているロードブロッキングを打ちました。ここで

は、ページ内に与えられたプログラムである -

(PARI) test(n)= {m=n; forprime(p=2, 5, while(m%p==0, m=m/p));           
return(m==1)} for(n=1, 500, if(test(n), print1(n", "))) 
(PARI) a(n)=local(m); if(n<1, 0, n=a(n-1); 
      until(if(m=n, forprime(p=2, 5, while(m%p==0, m/=p)); m==1), n++); n) 
(PARI) list(lim)={ 
lim\=1; 
my(v=List(), s, t); 
for(i=0, log(lim+.5)\log(5), 
    t=5^i; 
    for(j=0, log(lim\t+.5)\log(3), 
     s=t*3^j; 
     while(s <= lim, 
      listput(v, s); 
      s <<= 1; 
     ) 
    ) 
); 
vecsort(Vec(v)) 
}; 

私はPARIが何であるかを見つけましたが、私はC++にこのプログラムを変換することができません。 C++で同じシーケンスを生成するのに役立つ提案があれば、大歓迎です。

次のコードスニペットを使用してC++でシーケンスを生成しようとしました。しかし、私は、オンラインIDEでいくつかのテストに失敗すると、いくつかの数字が間違っていると思います。

for(int i = 0; i < 16; i++) 
{ 
    for(int j = 0; j < 15; j++) 
    { 
     for(int k = 0; k < 12; k++) 
     { 
      std::cout<<pow(2,i)*pow(3,j)*pow(5,k)<<std::endl; 
     } 
    } 
} 

私は16,15,12を制限として選択しました。そうしないと、結果の値が長い可変型をオーバーフローするためです。

+0

何を試しましたか? –

+0

私の編集をご覧ください。編集を完了する前に下の投票を受けなければなりませんでした。:( –

+0

あなたのプログラムに長いタイプはありません –

答えて

1

ここには3つのプログラムがあり、それぞれ異なる目的を果たしています。

最初に数値が5滑らかであるかどうかを確認します。 2,3分、5分で単純に除算し、何も残っていないかどうかをテストします。

2番目の5番目の平滑数が生成されます。それは最初のものと同じ考え方を使用し、範囲内の各数値をテストします。これは非常に非効率的です!

3つ目は、指定された範囲まで5つの滑らかな数字をすべて生成します。

私は、あなたの状況に最もよく当てはまると思われるので、第3のものがあなたが望むものと仮定します。 (それはまた、私がそのプログラムの著者であることに役立ちます。)

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main(void); 
std::vector<long> smooth(long lim); 

int main(void) { 
    long lim = 1000; 
    std::vector<long> v = smooth(lim); 
    std::cout << "5-smooth numbers up to " << lim << ": "; 
    for (std::vector<long>::iterator it = v.begin(); it != v.end(); it++) { 
     std::cout << *it << ", "; 
    } 
    std::cout << "\n"; 
    return 0; 
} 

std::vector<long> smooth(long lim) { 
    std::vector<long> v = {}; 
    for (long t = 1; t <= lim; t*=5) { 
     for (long s = t; s <= lim; s*=3) { 
      for (long n = s; n <= lim; n*=2) { 
       v.push_back(n); 
      } 
     } 
    } 
    std::sort(v.begin(), v.end()); 
    return v; 
} 

これはもちろん行単位の変換ではありません。たとえば、正確な対数はPARIのようなC++に組み込まれていないので、私は対数を使用しませんでした。これはかなり速いですが、1秒未満で1,844,674,407,370,955,161(64ビットマシンで実行できる最高)の5つのスムーズな数値をすべて見つけ出します。

関連する問題