C++

range

C++

Pythonのitertoolsを使ったような書き方がC++でもできるようにライブラリを作っていきます。具体的には、例えば、1から10の和を求めるときにこう書けるようにします。 cout << sum(range(1, 11)) << endl; Pythonのxrangeやtakewhileをクラスを使って実現し…

NULLでハマった

例えば、multimapで同じキーを持つ要素の個数を調べたいとしましょう。 #include <iostream> #include <map> #include <algorithm> #include <functional> using namespace std; struct S { }; int main() { multimap<int,S *> m; for(int n = 0; n < 3; n++) { m.insert(make_pair(1, new S())); m.insert(m</int,s></functional></algorithm></map></iostream>…

mem_funの使い方

例えばfor_eachの第3引数ですが、ここは関数オブジェクトを指定します。しかしそれを一々作るのもどうかと思うので、関数があればptr_funで関数オブジェクトを作ってそれを利用します。 #include <iostream> #include <vector> #include <algorithm> using namespace std; void print(int </algorithm></vector></iostream>…

それでも2倍だ

http://www.kmonos.net/wlog/111.html#_1001100720 かなり遅れた反応だったにもかかわらず(書く時間がなかなか取れなかった)、うちの記事を取り上げていただきました。ありがとうございます。 例えば、32bit整数を1億個のvectorを構築して、それに1個加え…

本当に1.5倍のほうがメモリ効率がよいのか

C++のstd::vectorにpush_backしていくと、ある領域を確保して、それを超えそうになったらまたある程度ゆとりのある領域を確保するという機構になっています。 2倍だけじゃない - d.y.d. にまとめてありますが、std::vectorや類似するコンテナは2倍ずつ領域…

Project Euler 50

http://projecteuler.net/index.php?section=problems&id=50 unfoldを作ってみた。

Project Euler 49

http://projecteuler.net/index.php?section=problems&id=49 重複組合せを出し、それぞれについて順列を出し、その中の2つずつを取って等差数列を作って次の口が順列にあるか調べて、あればそれぞれ素数か調べる。

Project Euler 48

http://projecteuler.net/index.php?section=problems&id=48 下10桁だけ計算すればよいから64ビットで済むが、64ビット同士の掛け算はできないので、5桁ずつに分けて計算する。

Project Euler 47

http://projecteuler.net/index.php?section=problems&id=47 順番に素数の個数を求めるだけ。

Project Euler 46

http://projecteuler.net/index.php?section=problems&id=46 これも一致する値を探すが、探すだけなので同じコードを使えなかった。 一致しない最初の値を出すので、dropwhileを作った。

Project Euler 45

http://projecteuler.net/index.php?section=problems&id=45 2つのiterableが一致する値を出すクラスを作る。 多角数を出すiterableがなかなか書けなかった。 場合分けしているのは、こうしないとギリギリintの範囲に収まらないから。long longにしておけば…

Project Euler 44

http://projecteuler.net/index.php?section=problems&id=44 とても遅い。確か逆から考えたほうが速いはず。

Project Euler 43

http://projecteuler.net/index.php?section=problems&id=43 最後に頭に数字をつけるところは、45からその数の各桁の合計を引けばよい。

Project Euler 41

http://projecteuler.net/index.php?section=problems&id=41 今度こそちゃんと順列を出すコードを書いた。

Project Euler 40

http://projecteuler.net/index.php?section=problems&id=40 数字を一桁ずつ出すクラスを作る。本当はそうする必要も無いが、練習のつもりで。

Project Euler 39

http://projecteuler.net/index.php?section=problems&id=39 p = 2lm(m + n) だから、l, m, nを変えてpを配列でカウントする。

Project Euler 37

http://projecteuler.net/index.php?section=problems&id=37 右から短くしていっても素数のままの数を求めるのと左からのもののアルゴリズムがほとんど同じなので、テンプレートを使って共通化できるところは同じコードを使うようにしたら、却ってコードが長…

Project Euler 36

http://projecteuler.net/index.php?section=problems&id=36 10進の回文数を再帰的に生成して、それが2進で回文になっているかを調べる。

Project Euler 35

http://projecteuler.net/index.php?section=problems&id=35 100万までの素数を求めてsetにしてすぐに素数判定ができるようにする。 回転はalgorithmのrotateを使う。

Project Euler 34

http://projecteuler.net/index.php?section=problems&id=34 これも暗黙の上限がある問題。 そこまでの整数をしらみつぶしにしても十分速いが、例えば123と213は同じ数に変換されるので、重複組合せを出すクラスを使うと非常に速い。これを自作した。

Project Euler 32

http://projecteuler.net/index.php?section=problems&id=32 重複は数えないからsetを使う。そして和を取る。iterableでsetを引数に取れるようにしたが、よく考えたらaccumulateを使えばいいだけだった。これがnumericにあることをいつも忘れる。

Project Euler 31

http://projecteuler.net/index.php?section=problems&id=31 再帰で簡単にかけるので、メタプログラミングしてみた。

Project Euler 30

http://projecteuler.net/index.php?section=problems&id=30 この問題は調べる範囲だけ。あとは素直に書くのみ。

Project Euler 29

http://projecteuler.net/index.php?section=problems&id=29 この問題は、まともに計算すると大変なので、素因数分解を行う。そして、その結果をsetに入れていく。 入れていくのにF#のiterが便利なのでそれを作った。 template<typename T, typename U> void iter(T& f, U& g) { whil</typename>…

Project Euler 27

http://projecteuler.net/index.php?section=problems&id=27 単純に必要な分素数判定する。素数判定をするのに素数で割っていく。その素数を出すためのクラスを作った。少しずつエラトステネスのふるいをしていく。

primes.h

素数や素因数分解に関するライブラリ。VC10β2で先取りしたC++0xの機能を用いている。 破壊的な変更がされる場合は別にエントリーを立てる。

Project Euler 28

http://projecteuler.net/index.php?section=problems&id=28 スパイラルの座標を次々に出すクラスを作った。

Project Euler 26

http://projecteuler.net/index.php?section=problems&id=26 本来オイラーの定理など数学を使えば速く解ける問題だが、題意通りに書いても十分速く答えが出る。

Project Euler 25

http://projecteuler.net/index.php?section=problems&id=25 以前作ったlongintクラスを使ってフィボナッチ数列を出すクラスを作る。

Project Euler 24

http://projecteuler.net/index.php?section=problems&id=24 この問題は本来順列を出す必要はないが、後々のために順列を出すクラスを作った。この問題の答えは出るが、あまりうまく動かない。