• ベストアンサー

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まで削りたいと思っています。 何か良い手はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.9

a;main(c){for(;0<c;printf("%d\n",a=c-a))c+=a;} for文のセミコロンを有効活用して、もう1byte削れますね。

honor
質問者

お礼

どうやらこれが正解のようです。 回答ありがとうございました。

その他の回答 (8)

回答No.8

トップのコードをさらしてしまうのは anarchy golfのため(?)を思うと躊躇されるのですが 70%がた回答が出ていると言っていい状況と思うので、ヒントだけ ここまで提案されていないmain再帰に関しては、gccの3項演算子に対する拡張機能使っても1バイト届かないパターンしかない(「?」orであろう)模様 No.6さんのコードについて、あと一点詰めればもう1バイト削れます。

honor
質問者

お礼

main再帰というのも面白そうですね。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.7

a; //aを0に初期化 main(c){ //cを1に初期化 for(;c>0;) //cがオーバーフローする(負になる)までフィボナッチ数計算 printf("%d\n",c=a+(a=c)); //cを表示 } これでどう?

honor
質問者

お礼

これですと解が2から始まってしまいますね。 どうやらNo.9の回答が正解のようです。

  • ky072
  • ベストアンサー率60% (85/140)
回答No.6

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) にしても 同じサイズです。

honor
質問者

お礼

演算子の活用が重要だったようですね。 素晴らしい解法をありがとうございます。 言い忘れていたのですが、47バイトというのは最後の改行込みの話なのです。 anarchy golfというサイトでは最短で46バイト(彼らは恐らく最後の改行を抜いている)ので、 もう1バイト減らせないでしょうか?

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.5

a; //aを0に初期化 main(c){ //cを1に初期化 for(;c>0;c+=a,a=c-a) //cがオーバーフローする(負になる)までフィボナッチ数計算 printf("%d\n",c); //cを表示 } とすれば、5byte削れます。

honor
質問者

お礼

演算子を使えば良かったんですね。 素晴らしい解法をありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「int が 1バイトの環境」だと困りませんか?

honor
質問者

お礼

intが1バイトの環境での動作は考えておりません。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

IOCCCにでも出すんですか? http://ja.wikipedia.org/wiki/IOCCC ソースを減らすなら ・改行やスペースを可能な限り削る。 ・コンパイラのオプション(-Dが多い)でマクロを定義する とかもありますが

honor
質問者

お礼

IOCCCというのも面白そうですね。 私はanarchy golfというサイトでこの問題を知りました。 質問では改行してありますが、実際は1行にしてます。スペースも可能な限り削っています。

回答No.2

安全性を無視するのはまぁいいとして,文法を無視するのは問題外でしょう。 少なくとも, a,b; や main(c) { は標準Cでは許されないので,処理系 (とオプション) を記述してみてはどうでしょうか。

honor
質問者

お礼

いかに短いコーディングで目的の出力を得るかが重要なので、動けば良いようです。 CPUはx86互換でコンパイラにgccを使うのが一般みたいです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

タイトルに書いてあることをコードに反映していないため、 質問者さんが本当に行ないたいことが何なのか、よくわかりません。

honor
質問者

お礼

コードから題の動作が得られるかは環境に依存します。 出力はフィボナッチ数を1から46番目まで表示することです。

関連するQ&A