- ベストアンサー
C言語でフィボナッチ数を46番目まで求めて表示
題のプログラムで可能な限りコードを短くしたいと考えています。 短くすることが目的なので、安全性等は無視しています。 a,b; //a,bを0に初期化 main(c){ //cを1に初期化 for(;c>0;a=b,b=c,c=a+b) //cがオーバーフローする(負になる)までフィボナッチ数計算 printf("%d\n",c); //cを表示 } これで54byteなのですが、47byteまで削りたいと思っています。 何か良い手はないでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
a;main(c){for(;0<c;printf("%d\n",a=c-a))c+=a;} for文のセミコロンを有効活用して、もう1byte削れますね。
その他の回答 (8)
- LongSecret
- ベストアンサー率68% (22/32)
トップのコードをさらしてしまうのは anarchy golfのため(?)を思うと躊躇されるのですが 70%がた回答が出ていると言っていい状況と思うので、ヒントだけ ここまで提案されていないmain再帰に関しては、gccの3項演算子に対する拡張機能使っても1バイト届かないパターンしかない(「?」orであろう)模様 No.6さんのコードについて、あと一点詰めればもう1バイト削れます。
お礼
main再帰というのも面白そうですね。
- nag0720
- ベストアンサー率58% (1093/1860)
a; //aを0に初期化 main(c){ //cを1に初期化 for(;c>0;) //cがオーバーフローする(負になる)までフィボナッチ数計算 printf("%d\n",c=a+(a=c)); //cを表示 } これでどう?
お礼
これですと解が2から始まってしまいますね。 どうやらNo.9の回答が正解のようです。
- ky072
- ベストアンサー率60% (85/140)
a;main(c){while(0<c)printf("%d\n",a=(c+=a)-a);} これで47bytesです。 while(0<c) を for(;0<c;) にしても c+=a,printf("%d\n",a=c-a) にしても 同じサイズです。
お礼
演算子の活用が重要だったようですね。 素晴らしい解法をありがとうございます。 言い忘れていたのですが、47バイトというのは最後の改行込みの話なのです。 anarchy golfというサイトでは最短で46バイト(彼らは恐らく最後の改行を抜いている)ので、 もう1バイト減らせないでしょうか?
- nag0720
- ベストアンサー率58% (1093/1860)
a; //aを0に初期化 main(c){ //cを1に初期化 for(;c>0;c+=a,a=c-a) //cがオーバーフローする(負になる)までフィボナッチ数計算 printf("%d\n",c); //cを表示 } とすれば、5byte削れます。
お礼
演算子を使えば良かったんですね。 素晴らしい解法をありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「int が 1バイトの環境」だと困りませんか?
お礼
intが1バイトの環境での動作は考えておりません。
- kmee
- ベストアンサー率55% (1857/3366)
IOCCCにでも出すんですか? http://ja.wikipedia.org/wiki/IOCCC ソースを減らすなら ・改行やスペースを可能な限り削る。 ・コンパイラのオプション(-Dが多い)でマクロを定義する とかもありますが
お礼
IOCCCというのも面白そうですね。 私はanarchy golfというサイトでこの問題を知りました。 質問では改行してありますが、実際は1行にしてます。スペースも可能な限り削っています。
- Yune-Kichi
- ベストアンサー率74% (465/626)
安全性を無視するのはまぁいいとして,文法を無視するのは問題外でしょう。 少なくとも, a,b; や main(c) { は標準Cでは許されないので,処理系 (とオプション) を記述してみてはどうでしょうか。
お礼
いかに短いコーディングで目的の出力を得るかが重要なので、動けば良いようです。 CPUはx86互換でコンパイラにgccを使うのが一般みたいです。
- asuncion
- ベストアンサー率33% (2127/6289)
タイトルに書いてあることをコードに反映していないため、 質問者さんが本当に行ないたいことが何なのか、よくわかりません。
お礼
コードから題の動作が得られるかは環境に依存します。 出力はフィボナッチ数を1から46番目まで表示することです。
お礼
どうやらこれが正解のようです。 回答ありがとうございました。