トップページ⇒tech
523コメント255KB

■■C++で大きな数を作るスレ■■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/03/24(火) 20:27:50
C++ で大きな数を返すプログラムを作るスレです。
以下のプロトタイプの関数の戻り値で出来るだけ大きな数を返すものを作りましょう。

int main();

●ルール
最大でも1スレに収まる範囲とし、
1スレで完結したプログラムとしてください。
文字数も書いてください

●言語仕様
言語は C++ 2003 準拠とします
int と float は十分な精度があるとします
メモリは十分にあるとします
実行時間は問わないこととします

機種依存、コンパイラ依存の値が返るプログラムは不可
プリプロセッサ、ライブラリの使用は不可

●文字数カウントルール
動作上不要なコメント、スペース、タブ、改行は文字数に含めない
言語上必要なスペース、タブ、改行はカウントする(改行は1文字とする)
0088デフォルトの名無しさん2009/04/01(水) 21:20:18
>>87  じゃない?多分。
int main() {
    return 9;
}
0089デフォルトの名無しさん2009/04/01(水) 21:42:58
テスト

int main(){
    int n(0);
    while( rand() ){
        n++;
    }
    return n;
}
0090デフォルトの名無しさん2009/04/03(金) 00:07:42
100文字以内でのチャンピオンは俺がもらった!
100文字の制限がなくても今までで最大。

// 100文字
int a(int b,int c,int d){
    return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}
0091デフォルトの名無しさん2009/04/03(金) 01:47:44
int a=9;int main(){return a--?1<<main():1;}

とりあえずテトレーションを書いて見たかった。
0092デフォルトの名無しさん2009/04/03(金) 08:31:01
>>91
お〜〜〜、目から鱗。
引数無しでも再帰が書けるのか。
0093デフォルトの名無しさん2009/04/03(金) 11:16:47
>>91
その1は9にした方がいいんジャマイカ?
つーか、それぞれいくつになるのかと1文字あたりいくつになるかくらい書いとけ。
0094デフォルトの名無しさん2009/04/03(金) 13:15:58
>>93
>>92のままだと要するに2↑↑9だから簡単な数式であらわせるから、
大きさの見積もり楽だなぁという理由であえて1にしてました。

このスレは出来る限り大きな数を目標にしてるから9のほうがいいんだろうけどねぇ。
0095デフォルトの名無しさん2009/04/03(金) 19:29:35
ちょっと質問だが、 new int[n]は使ってよいの?
もっとも使ったところで役に立つかどうかはまだわからないけど。
0096デフォルトの名無しさん2009/04/03(金) 22:49:26
>>95
もちろんOK.
C言語ではなくC++にした一番の理由が、
言語上でメモリ確保が出来ること。

メモリは十分にあるのでメモリ確保は失敗しない。
mainリターン時に解放していなくてもOK.
ということで。

>>94
このスレ的には
値の綺麗さや実行時間やメモリ使用量やバイナリサイズは一切問わず、
同じ文字数なら1でも大きい数を返す、
同じ大きさを返すなら1文字でも短くする、
のが目的。

ということで、
1を9に変えさせていただきます。
int a=9;int main(){return a--?9<<main():9;} // 43文字

きれいな数値でなくても、>>1 が責任を持って大きさを比較します。

>>93
mainの戻り値は簡単に書けないくらいの大きさになるので、
いくつになるか書くのは難しいかと。
0097デフォルトの名無しさん2009/04/03(金) 22:57:20
今までの記録

int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 9e9;} // 23文字
int main(){return 9e99;} // 24文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
int a=9;int main(){return a--?9<<main():9;} // 43文字

// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}

// 100文字
int a(int b,int c,int d){
    return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}

大きく空いている44文字〜76文字の作品と、
文字数無制限(ただし1レス以内)の作品を特に募集中。
0098デフォルトの名無しさん2009/04/03(金) 23:33:41
環境依存だけどこんなの思いついた。
int main(){int i;return (int)&i;}//33文字?

思ったより短くないなぁ。。。
0099デフォルトの名無しさん2009/04/04(土) 01:29:05
それだったらこんなのもいいじゃない。
int main(){return (int)main;}
0100982009/04/04(土) 04:02:33
あーそれいいね。
俺よりは環境依存っぽくない。
0101デフォルトの名無しさん2009/04/04(土) 13:48:17
スタックのメモリ空間が独立していたらしょぼい結果になりそうだけど。
ロードアドレスもそうだね。少なくとも、24文字の9e99に勝てそうにないし。
ってことで、24と42の間を無駄に埋めてみる。
int main(){return 9e99*9e99;} // 29文字
0102デフォルトの名無しさん2009/04/04(土) 21:36:26
私の思いつく範囲だと、
たぶん42文字まではこんな感じじゃないかと思うんだけど、
もっと大きいのあるかなあ?

int main(){return 9;} // 21文字
int main(){return 99;} // 22文字
int main(){return 9e9;} // 23文字
int main(){return 9e99;} // 24文字
int main(){return 9e999;} // 25文字
int main(){return 9e9999;} // 26文字
int main(){return 9e99999;} // 27文字
int main(){return 9e999999;} // 28文字
int main(){return 9e9999999;} // 29文字
int main(){return 9<<(9<<99);} // 30文字
int main(){return 9<<(9<<999);} // 31文字
int main(){return 9<<(9<<9999);} // 32文字
int main(){return 9<<(9<<99999);} // 33文字
int main(){return 9<<(9<<999999);} // 34文字
int main(){return 9<<(9<<(9<<99));} // 35文字
int main(){return 9<<(9<<(9<<999));} // 36文字
int main(){return 9<<(9<<(9<<9999));} // 37文字
int main(){return 9<<(9<<(9<<99999));} // 38文字
int main(){return 9<<(9<<(9<<999999));} // 39文字
int main(){return 9<<(9<<(9<<(9<<99)));} // 40文字
int main(){return 9<<(9<<(9<<(9<<999)));} // 41文字
int main(){return 9<<(9<<(9<<(9<<9999)));} // 42文字
0103デフォルトの名無しさん2009/04/04(土) 22:02:53
VC++ 2008でint main(){return 0xffffffff;}相当
cl t.c /link /merge:.text=.data

char main[]={184,-1,-1,-1,15,195}; //34字
_int64 main=0xc30fffffffb8; //27字

今思った。VC++と縛りを入れた以上、INT_MAXの0x7ffffffffのほうがいいのではないかと。

いずれにせよ>>102には遙か及ばない。
0104デフォルトの名無しさん2009/04/04(土) 22:04:06
C++の規約で巨大数を作れとか、圏論をXMLに適応させろとか、
数学ネタのスレは良く分からん。
0105デフォルトの名無しさん2009/04/05(日) 11:56:06
>>1

「int と float は十分な精度があるとします 」
これの意味と

どうやって大きい数と判定しているかを教えてくれ


(ちゃんと勉強している者が)普通に考えたら >>36 がいってることが正しい
0106デフォルトの名無しさん2009/04/05(日) 19:59:50
>>105
> 「int と float は十分な精度があるとします 」
> これの意味と

int に関しては、
>>1 のルールを守ったプログラムの中で、
最大の数を返すプログラムでもオーバーフローしない程大きいと思ってください。
(int のサイズに依存したプログラムで無ければ、1レスで作れる最大の数が定義出来るはず)
これで意味がわからなければ、
どんな整数もあらわせる多倍長の整数クラスみたいなものと思って頂いてもいいです。
(ただし、シフトやビット演算は普通の int のふるまいと同じです。)

float に関しては、
十分大きな数も保持出来るのに加えて、
演算に誤差がないもとのします。
内部的には上のint型2個による有理数みたいなものと思ってください。
C++の言語上はfloatの演算は +-*/ しかないので
有理数の範囲で誤差がない演算ができます。
double 型の定数からも誤差なくfloatに変換できるとします。

----
多倍長整数クラスや多倍長有理数クラスでも結局
普通の環境を想定すると new int[size] のsize が大きくなりすぎるし、
ポインタ型も大きくなりすぎるんだよね。
0107デフォルトの名無しさん2009/04/05(日) 20:21:38
>>105
> どうやって大きい数と判定しているかを教えてくれ

>>1 が責任を持って比較、判定します。
答えになってないか。

1レスで書ける程度のプログラムで、
ただひたすら大きな数を作るようなプログラムなら、
>>1 は大きさを見積もれるのではと思っています。(自信過剰?)
また、逆に >>1 が大きさを見積もれないほど大きな数が作れるならそれも見てみたい。

現代数学では大きさが見積もれないようなプログラムだったとしたら、
(たとえば存在が証明されてないような数を返すプログラム)
比較が出来ないかも知れないけど、
その場合も大きさ判定不能な作品として残したいと思います。
判定不能でも文字を極限まで減らすような努力もできるし。
0108デフォルトの名無しさん2009/04/05(日) 20:23:04
>>105
> (ちゃんと勉強している者が)普通に考えたら >>36 がいってることが正しい

>>9 より力技の >>61 の方が大きいし、
たくさんの人がいろんな発想で挑戦すれば超えられるかも知れない。
文字数が少ないものは数学の知識よりもC++の知識の方が重要だし。
だれかが作ったものに文字を追加してさらに大きな数を作るようなこともできる。
数学がぜんぜんダメな人でも
C++に詳しければ同じ値で文字数を減らすことが出来るかも知れないし。

とにかくいろんな発想で大きな数を作ったり文字を減らすのが見たい。
大きさの比較は >>1 が責任を持って行います。
0109デフォルトの名無しさん2009/04/05(日) 21:05:54
>>108
比較の内容と結果をちゃんと書けよ。
01101052009/04/05(日) 22:11:37
>>106

/*
 File : test.cpp
 Compile : g++ test.cpp -lgmpxx -lgmp
*/
#include <iostream>
#include <gmpxx.h>

typedef mpz_class BigInteger;

BigInteger fact(int n){
  BigInteger ans = 1;
  do { ans *= n; } while( --n );
  return ans;
}

BigInteger f(){
  return fact(100);
}

int main(){
  std::cout << f() << std::endl;
  return 0;
}

「ライブラリ使用不可」ってのを破ってるけど
「int と float は十分な精度があるとします 」
を守るためだけに使いました
この例では単純な factorial(100) を出力するやつを書いてみた
要は上の f() を main() に変えて大きな数を作るってことでOK?
01111052009/04/05(日) 22:12:31
>>107
>>108

> >>1 が責任を持って比較、判定します。
> 答えになってないか。

はい、答えになっていません


> >>1 は大きさを見積もれるのではと思っています。(自信過剰?)
> 大きさの比較は >>1 が責任を持って行います。

たとえば
>>9 と >>61 の桁数を教えてください
本当に >>61 のほうが大きいのですか?
私にはわかりません
(両方とも)とても計算できそうにないので


> C++に詳しければ同じ値で文字数を減らすことが出来るかも知れないし。
きっとそうですが、
「数値の大きさ」と「コードサイズ」を比べるのは
アンマッチな感じがします
0112デフォルトの名無しさん2009/04/05(日) 22:52:17
お前がこのスレにアンマッチなんだろう。
0113デフォルトの名無しさん2009/04/05(日) 23:08:24
>>109
そりゃそうですね。書きます。
その文字数以内で最大の物はそれより小さい文字での最大のものより大きい説明を、
最大でないものはより文字数が小さいものorより値が大きいものとの比較を
書いていきます。

■ >>10-17,40,64,84,86,89,98,99,103
ルール違反

■ >>2
50文字
初期値 n=99 に対して、n<<=n を 100 回行っている。
>>96 の 初期値 x=9 に対し、x=9<<x を9回行ったものより明らかに大きい。
【50文字以下最大】

■ >>9
>>47で同じ数字を86文字で表現

■ >>21
>>28の3行目で同じ数字を53文字で表現している

■ >>22
>>102の方が明らかに大きい

■ >>28
>>56で同じ値を52文字で表現している
0114デフォルトの名無しさん2009/04/05(日) 23:09:06
■ >>32
>>102の方が明らかに大きい

■ >>35
>>102にまとめて記述
41文字以下のどの作品よりも明らかに大きい
【42文字以下現在最大】

■ >>39
これは99の階乗。
99の階乗 < 99の99乗 < 128の99乗 = 2の693乗 < 2の(9<<99)乗 < 9<<(9<<99)

■ >>56
24文字
>>102にまとめて記述
【24文字以下現在最大】

52文字
初期値 i=9e99 に対して、i<<=i を 9e99+1 回行っている。
>>2 の50文字の作品よりも明らかに大きい
【52文字以下現在最大】

■ >>57
>>102にまとめて記述
【23文字以下現在最大】
0115デフォルトの名無しさん2009/04/05(日) 23:10:14
■ >>75
>>77 で同じ値を118文字で表現している

>>77 の k(x,y,1) も xのy乗となる為、
『 >>75 の k(x,y,n) 』= 『 >>77 の k(x,y,n) 』
>>75 の G(w) は 初期値 z=4 に対し z=k(3,3,z) をw回繰り返したものであり、
>>75 と >>77 の118文字は同じ値を返す。

■ >>88
>>102にまとめて記述
【21文字以下現在最大】

■ >>91
96の43文字の方が明らかに大きい

■ >>96
返る値は
9<<(9<<(9<<(9<<(9<<(9<<(9<<(9<<(9<<9))))))))
であり、
42文字以下の >>102 のいずれよりも明らかに大きい
【43文字以下現在最大】

■ >>101
>>102の29文字の方が明らかに大きい
0116デフォルトの名無しさん2009/04/05(日) 23:11:24
>>47,61,77,83,90 の比較はちょっと長いので後ほど。
0117デフォルトの名無しさん2009/04/05(日) 23:12:06
>>110
そんな感じです。
0118デフォルトの名無しさん2009/04/05(日) 23:18:54
Conwayのチェーン表記を書いてみた
ttp://en.wikipedia.org/wiki/Conway_chained_arrow_notation

int p(int x,int y){return y?x*p(x,y-1):1;}
int e(int*a,int n){
if(n==1)return a[0];
if(n==2)return p(a[1],a[0]);
if(a[0]==1)return e(a+1,n-1);
if(a[1]==1)return e(a+2,n-2);
int x,y;
a[0]--;x=a[1]--;a[1]=e(a,n);y=e(a,n);a[0]++;a[1]=x;return y;}
int main(){int a[]={9,9,9,9,9,9,9,9,9};return e(a,9);}
0119デフォルトの名無しさん2009/04/05(日) 23:58:31
無限にintは大きいんだろ??
int main(){return (unsigned)~0;}
012012009/04/06(月) 00:00:26
>>113-115の続き

>>61 の883文字は、
int A(int y, int z){y?z?a(y-1,a(y-1,a(y,z-1)):9:9<<z;}
とすると、
A(1,z) = a(z)
A(2,z) = b(z)
A(3,z) = c(z)
...
A(25,z) = y(z)
となります。

>>77 の118文字は、
int k(int x,int y,int n){return n?y?k(x,k(x,y-1,n),n-1):1:x*y;}
これのxを3に固定し、yとnを入れ替えると
int K(int n,int y){return y?n?k(n-1,k(n,y-1)):1:3*n;}
となります。

>>90 の100文字は、
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
これのbを0に固定すると、
int A(int c,int d){return c&&d?a(c-1,a(c,d-1)):d+9;}
となります。
012112009/04/06(月) 00:02:01
それぞれの再帰関数を並べると以下のようになって、
いずれかの引数が0の場合の定義のみ異なり、
どちらも0でない場合の定義はまったく同じであることが分かります。

47-86,77-113
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):a(m-1,1):n+1;}

47-80
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}

61-883
int A(int y, int z){y?z?a(y-1,a(y-1,a(y,z-1)):9:9<<z;}

77-118
int K(int n,int y){return y?n?k(n-1,k(n,y-1)):1:3*n;}

83-77, 83-103
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}

90-100
int A(int c,int d){return c&&d?a(c-1,a(c,d-1)):d+9;}
012212009/04/06(月) 00:03:39
左の引数が0の時の定義は、
47-86 の n+1 と 61-883 の 9<<z で大きく異なるようにみえるが、
実は左の引数を数個増やすだけでこの程度の差は吸収してしまう。

たとえば、
47-86 の場合、
a(0,n) = n+1
a(1,n) = n+2
a(2,n) = n*2+3
a(3,n) = 2の(n+3)乗 -3
となる。

同様に、右の引数が0の時の定義も、
右の引数を数個増やすだけで吸収してしまう。

つまり、>>121 の関数は、引数を数個変えると追いつく程度の差しかなく、
左の引数が9と99では、初期値が上のいずれであっても
左の引数が99である方が大きくなる。
012312009/04/06(月) 00:06:29
90-100 を見てみる。

a(1,0,d) ≧ a(0,d,d) であり、
a(1,1,d) は、初期値x=9 に対し、x=a(1,0,x) を d 回行ったものである。
つまり、
a(1,1,d) は、初期値x=9 に対し、x=A(x,x) を d回行ったものより大きいので、
a(1,1,64) で、77-118 とだいたい同じ数となって、
a(1,1,99) で、77-113 や 83-103 とだいたい同じ数となる。

a(1,2,2) = a(1,1,a(1,1,a(1,2,0))) = a(1,1,a(1,1,9)) >> a(1,1,999)
であるので、
それより大きい a(1,9,9) は 77-118,77-113,83-103 より大きい。
012412009/04/06(月) 00:07:39
■ >>47
86文字
同じレスの80文字の方が大きい

80文字
【80文字以下現在最大】

■ >>61
>>47 の80文字の方が大きい

■ >>77
118文字、113文字とも >>90 の100文字に負けている

■ >>83
77文字
【77文字以下現在最大】

103文字 >>90 の100文字に負けてる

■ >>90
100文字
【100文字以下現在最大】
012512009/04/06(月) 00:11:38
現在の記録をまとめると、

42文字以下
>>102

int a=9;int main(){return a--?9<<main():9;} // 43文字
int main(){int n=99,m=n;while(m--)n<<=n;return n;} // 50文字
int main(){int i=9e99,f=i;while(f--)i<<=i;return i;} // 52文字

// 77文字
int a(int b,int c){return b*c?a(b-1,a(b,c-1)):c+9;}
int main(){return a(9,9);}

// 80文字
int a(int m,int n){return m?n?a(m-1,a(m,n-1)):m:n*9;}
int main(){return a(99,9);}

// 100文字
int a(int b,int c,int d){
return b+c&&d?a(c?b:0,c?c-1:d,a(b,c,d-1)):d+9;
}
int main(){return a(1,9,9);}

※ >>118 はこれから評価します。
0126デフォルトの名無しさん2009/04/06(月) 16:09:42
int main(){ unsigned int i=-1; return (i>>1)-1;}//48文字
環境依存かなぁ。
0127デフォルトの名無しさん2009/04/06(月) 18:55:22
>>118
このままだとあまり大きくなく、
>>125 の80文字 のより小さい。

× a[0]--;x=a[1]--;a[1]=e(a,n);y=e(a,n);a[0]++;a[1]=x;return y;}
○ x=a[1]--;a[1]=e(a,n);a[0]--;y=e(a,n);a[0]++;a[1]=x;return y;}

このように直すと今のところ最大。(290文字)

※この数が290文字で記述できるとは思わなかった
0128デフォルトの名無しさん2009/04/07(火) 01:40:07
減速しちゃったねぇ。。。
0129デフォルトの名無しさん2009/04/07(火) 19:25:18
>>126ってどうなの??
0130デフォルトの名無しさん2009/04/07(火) 22:42:14
>>126
>>2 のダメな例の2個目と同じ発想。
int のサイズや負の数の表現方法に依存する。
激しく既出なルール違反。

ちなみに、
負の数に1の補数表現や2の補数表現を使った処理系の多くは 『{2の(intのビット数-1)乗} -2』 が返り、
負の数に符号ビット+絶対値を使った処理系の多くは 『2の(intのビット数-2)乗』 が返る。
トラップ表現のある実装の場合はトラップ表現が返る場合もあるかも知れないし、
飽和演算の処理系では 0 が返ることがあるかも知れない。
C++の規格上は不定である。
0131デフォルトの名無しさん2009/04/07(火) 23:02:49
>>118の修正版をがんばって縮めてみました。

// 191文字
int e(int*a,int n){
    int x,y,&z=a[1],t[]={*a-1,z};
    return n<3?*a?e(t,2)*z:1:z<2||*a<2?e(a+1,n-1):(x=z--,z=e(a,n),--*a,y=e(a,n),++*a,z=x,y);
}
int main(){int a[]={9,9,9,9,9,9,9,9,9};return e(a,9);}
0132デフォルトの名無しさん2009/04/07(火) 23:12:39
>>130
書いてあったのね。これは不覚。。。
あと負の表現については勉強になった。色々あるんだね。
0133デフォルトの名無しさん2009/04/07(火) 23:44:45
>>132
負の数の表現とか、わりとどうでもいいことを書いちゃったけど、
要はこのスレの目的は、
「int の最大値を返すプログラムを作るスレ」じゃなくて、
「C++という言語を使って、出来るだけ短く出来るだけ大きな数を定義するスレ」
なのでよろしく。

>>102 のような表を作っていくのが目的です。
0134デフォルトの名無しさん2009/04/07(火) 23:54:34
りょーかい!
0135デフォルトの名無しさん2009/04/08(水) 00:02:47
クラス、テンプレートもありだよね?
つってもそれを生かすアイディアが無いけど。
0136デフォルトの名無しさん2009/04/08(水) 00:30:43
俺にはこれが限界。100字くらい。何文字かは削れそうだが。。。

int r(int v,int N){
if(N==0) return v<<9;
return r(v<<9,N-1)*r(v<<9,N-1);
}

int main(){
return r(9,9);
}
0137デフォルトの名無しさん2009/04/08(水) 00:31:56
>>135
もちろんありです。

構造体の struct は class より1文字多いですが、
public: の記述が不要なので、
クラスよりも使えるかもしれません。

new もメモリ確保するには必須ですが、
メモリは無尽蔵にあるので
delete は使う機会が無いかもしれません。
0138デフォルトの名無しさん2009/04/08(水) 01:00:42
>>136
r(9,9) = (2の46080乗) * (3の1024乗) ≒ 1.08234329*10^14360

だから、

int main(){return 9e99999;} // 27文字

の方が大きいかも。
0139デフォルトの名無しさん2009/04/08(水) 01:21:04
>>138
ハードル高いね。
浮動少数リテラルが強すぎる。。。難しいなぁ。
0140デフォルトの名無しさん2009/04/13(月) 14:24:18
http://uproda.2ch-library.com/lib118897.zip.shtml

スレの発展には関係なくて申し訳ないのですが、やたらと大きな整数とか
を計算できる電卓を作ってみました(win32 console アプリケーション)
もし良ければ使ってみてください
2^1000 とか 1000! みたいなのが問題なく計算できます
0141デフォルトの名無しさん2009/04/13(月) 17:14:18
>>140
ヘルプがないからコマンドがわからんなぁ。-hで反応しないし。
0142デフォルトの名無しさん2009/04/13(月) 17:20:15
>>141
ヘルプついてなくて大変もうしわけありません。

優先順位が同じになる二項演算を()でくくっていただければ、
整数と実数の加減乗除とか初等関数を使った普通に書いた数式を
受け付けるはずで

リターンしていただければ普通に値を計算するはずなのです・・
要は関数電卓もどきかと
0143デフォルトの名無しさん2009/04/13(月) 17:44:39
>>142
あぁ〜!俺勘違いしてたよ。
コマンドラインツールだと思って引数で計算させようとしてた。何か無限ループしてるみたいになったような??
0144デフォルトの名無しさん2009/04/13(月) 20:05:51
>>140
バグ報告

演算子の計算の順番がおかしい
a/b/c = a/(b/c)
a-b-c = a-(b-c)
となっている

2/3のような1未満になる分数を含んだ結果がおかしい
1+2/3 が D9 と表示される

質問
型は整数型と有理数型と小数型の3種類ですか?
sin や cos や exp はどのように計算してますか?
割り算やルートはどのように計算してますか?
0145デフォルトの名無しさん2009/04/13(月) 20:11:03
とりあえずつ Scheme
0146デフォルトの名無しさん2009/04/13(月) 20:18:09
いやいや つ bc
0147デフォルトの名無しさん2009/04/13(月) 20:27:43
これのことか!
ttp://www.moris-shop.net/item/18921.html
0148デフォルトの名無しさん2009/04/13(月) 20:44:35
おまいら、大きい数を考えろや。
0149デフォルトの名無しさん2009/04/13(月) 22:14:11
#include <math.h>
int main()
{
return pow(9,pow(9,pow(9,pow(9,(pow(9,9))))));
}

文字数がある程度増えてくれば指数表現よりもこちらの方が大きい
ような気がしますがどうでしょうか?

ということで、>>144 さん バグ報告をありがとうございました
スレ違いなので、改定版はどこかにまた出しますが今回だけお返事を

>>演算子の計算の順番がおかしい
式表現のBNFの書き方がまずかったようです parser に手を入れます
>>1+2/3 が D9 と表示される
単純なバグでした(他にも負数負数の計算後の表示が変でした)手元では直しました

>>型は整数型と有理数型と小数型の3種類ですか?
整数型と有理数型で最後の表現のときに小数表示に直しています
sin や cos や exp はどのように計算してますか?
>> exp log sin cos asin, atan はテーラー展開で計算して
pai, tan, acos はそれらを使っての計算です
>>割り算やルートはどのように計算してますか?
割り算はそのまま、ルートは a^2 = x -> a = (x/a + a)/2
の関係式を使って計算しています
0150デフォルトの名無しさん2009/04/13(月) 22:28:28
>>149 >>1 を見たらライブラリは使用不可でした。
前のレスは無効ということでお忘れください。大変失礼しました
0151デフォルトの名無しさん2009/04/13(月) 23:13:33
適当なクラス作ってoperator*でも定義したらいいじゃないか
0152デフォルトの名無しさん2009/04/14(火) 08:49:27
int n=99,m=n;
int main()
{
return m--?n<<=main():n;
}

何の意義もないけど、一文字縮むような感じ? 49文字
0153デフォルトの名無しさん2009/04/14(火) 09:11:39
>>152
n<<=main()が不定。
main()を先に評価するかnを先に評価するかで結果が変わる
0154デフォルトの名無しさん2009/04/14(火) 22:31:16
まあいずれにしろ、
43文字で再帰コールでシフトをしてる作品があるからね。
これの再帰回数を単純に増やせばある程度は大きくなる。

下の45文字ので >>125 の50文字を超え、
下の47文字ので >>125 の52文字を超えるはず。

int a=9;int main(){return a--?9<<main():9;} // 43文字
int a=99;int main(){return a--?9<<main():9;} // 44文字
int a=9e9;int main(){return a--?9<<main():9;} // 45文字
int a=9e99;int main(){return a--?9<<main():9;} // 46文字
int a=9e999;int main(){return a--?9<<main():9;} // 47文字

でも77文字まではずいぶんと文字数があるから、
それまでには上のような単純にaの値を増やす以外の別の方法で
もっと効率よく大きな数を作る方法があると思う。
0155デフォルトの名無しさん2009/04/14(火) 23:18:57
int main(){return (int)tan(1e-9999999);}
0156デフォルトの名無しさん2009/04/14(火) 23:56:02
tanは反則だし、tan(1/x)っておもったほど大きくならなかった希ガス。
0157デフォルトの名無しさん2009/04/15(水) 00:03:34
あれ、なんか変だな。
大きくなるのはtan(π/2(1-1/x))だっけ?
でも、この式もあんまり増加率高くなかったはず。
0158デフォルトの名無しさん2009/04/15(水) 04:01:25
寝ようとしてたのに眠れん。
で、閃いた。これ究極じゃね?
23文字位。

int main(){
return 1/0;
}

確か±無限だよね。いっちばーん。
0159デフォルトの名無しさん2009/04/15(水) 06:57:19
>>158
つまり、-∞でいちばん小さいんですね。
0160デフォルトの名無しさん2009/04/15(水) 07:35:26
>>158
マジレスするとゼロ除算で動作未定義。
>>2 のダメな例4個目の整数版。
0161デフォルトの名無しさん2009/04/15(水) 07:48:27
>>155
tan(1e-9999999) ≒ 1e-9999999 だから
戻り値0

>>157
tan(π/2-x) = 1/tan(x)
だから、
xが大きい時は、
tan(π/2(1-1/x)) = 1/tan(π/(2x)) ≒ 2x/π
0162デフォルトの名無しさん2009/04/15(水) 10:07:41
アホみたいな感想で悪いんだけど、defineありなら、
#define A 9e9999999
int main(){return A^A^A^A^A^A;}
みたいなのがAの定義とmain内の個数で調整すると、最終的に大きくなんないかな?
01631582009/04/15(水) 15:35:29
>>160
げ、書いてあったか。
一通り流し見したと思ったが。。。
浅はかでした。Orz
0164デフォルトの名無しさん2009/04/15(水) 19:03:40
>>162
たぶん短くなるとは思うけど、
一応ルール上はプリプロセッサ使用不可なので #define や #include などは禁止です。

typedef は使えるので、
長いプログラムではintやfloatやboolを1文字にtypedefすれば短くなるかも。
0165デフォルトの名無しさん2009/04/15(水) 19:18:18
>>162
float a = 9e999999;でいいだろう。
0166デフォルトの名無しさん2009/04/15(水) 23:17:45
値の定義だけならそれでも良いけど、
#define だともっといろんなことが出来る。

#define A(x) (x<<x)
#define B(x) for(int i=0;i<x;i++){
#define C(x) struct x{
#define D(x) return x;}
#define E(x) (*x)->f()

固定辞書の圧縮みたいな感じ。
0167デフォルトの名無しさん2009/04/16(木) 05:32:09
携帯から。警告でるだろうけど。
int a=9e9;class A{public:int b;A operator*(A c){for(b=a;b--;)a<<=a;return c;}};
int main(){******************************************************A();return a;}
0168デフォルトの名無しさん2009/04/16(木) 06:15:25
よく考えたらa=9e9をa=9にして*を2つ増やした方が大きかった
0169デフォルトの名無しさん2009/04/16(木) 06:54:16
コンパイル通らない
0170デフォルトの名無しさん2009/04/16(木) 07:09:01
これなら通るみたい。

int a=9e9;class A{public:int b;A operator*(){for(b=a;b--;)a<<=a;return *this;}};
int main(){******************************************************A();return a;}
0171デフォルトの名無しさん2009/04/16(木) 07:24:29
まぁコンパイル通しても無駄だらけで割とどうでもいい。
class{public:をstructに置きかえれる。
int b;int a=9e9,b;にしたほうが短い。

致命的なのは
**..**A()はfor(int i=99;i--;)*A();のほうが短い。
ここまでいくと*A()とか書く暇があったら処理の中身をinlineしたほうが短い。
結論としてはclassいらない
0172デフォルトの名無しさん2009/04/16(木) 07:48:51
無駄は多いけど、戻る値は大きいよ。

ループにして縮めてみた。
たぶん同じ値が返る。

int main(){
    int a=9e9,b,c=54;
    for(;c--;)
        for(b=a;b--;)
            a<<=a;
    return a;
}

もちろんこうした方が大きい。
    int a=9e9,b,c=a;
0173デフォルトの名無しさん2009/04/16(木) 07:52:21
int main(){int a=9e9,b,c=a;for(;c--;)for(b=a;b--;)a<<=a;return a;} // 66文字
0174デフォルトの名無しさん2009/04/16(木) 08:51:03
1重ループに圧縮してついでに大きくしてやった
int a=9e9,b,c=a;int main(){while(b?b--:b=a*c--)a<<=a;return a;}
63B
0175デフォルトの名無しさん2009/04/16(木) 12:57:22
いや皆さんのおっしゃる通りです勉強にたります。
懲りずにまた携帯からw
int a=9;int f(){for(int b=a;b--;)a<<=f(f(f(f(f()))));return a};int main(){retern a;}
0176デフォルトの名無しさん2009/04/16(木) 13:01:38
誤字がいっぱいありますね。すいません。
0177デフォルトの名無しさん2009/04/16(木) 13:08:07
あ-あ、これだと無限ループになるからだめですね;
0178デフォルトの名無しさん2009/04/16(木) 13:25:41
int a=9;int f(int b){if(!b)for(b=a;b--;)a<<=f(f(f(f(f(0)))));return a;}int main(){return f(a);}
これでループとまるかな。
0179デフォルトの名無しさん2009/04/16(木) 13:30:44
if(!b)はif(b)の間違い。b=aは不要でした。
0180デフォルトの名無しさん2009/04/16(木) 16:04:20
単純に172を関数にする方がいいことに気づいた。
int a=9e9;int f(int c){for(;c--;)for(b=a;b--;)a<<=a;return a;}int main(){return f(f(f(f(f(a)))));}
0181デフォルトの名無しさん2009/04/16(木) 20:36:13
三日前に登場した電卓男>>140 ですが、ご指摘のあったバグを一通り直した
ver 0.2 を作ってみました。今度は任意の小数点精度の計算が設定可能です

http://pc12.2ch.net/test/read.cgi/software/1238682994/

スレ違いなので、過疎ってるソフト板のスレにの方にリンクをはっおきました。
とりあえず一応努力してみたご報告ということで失礼いたしました
0182デフォルトの名無しさん2009/04/16(木) 21:15:27
やっとPC使える... 今までの中で最大のつもり。
int main(){enum{s=9e9};int a=s,b[s],*c=b+s;for(;c---b;)*c=a;for(c=b;c<b+s;){a<<=a;--*c;if(!*c){*c++=a;continue;}c=b;}return a;}//128文字
0183デフォルトの名無しさん2009/04/16(木) 23:09:09
enumとかまたトリッキーな技を持ってきたな。
0184デフォルトの名無しさん2009/04/17(金) 01:02:38
>>174
こんな技があったとは。
>>91 以来の衝撃。
3文字縮めた上に微妙に大きくなってる。

さらにループにして、同じ技を使って3重ループ相当を1重ループにしてみた。

int a=9,b,c,d=a;int main(){for(;b?b--:c?b=a*c--:c=a*d--;)a<<=a;return a;} // 73文字
0185デフォルトの名無しさん2009/04/17(金) 01:09:58
>>182
これは上のループを9e9重にした感じですか。
enum{s=9e9}; がうちの環境(VC 2005)だとエラーになってしまうのですが、
仮に s の所をそのまま9に置き換えたとしても9重ループ相当。
0186デフォルトの名無しさん2009/04/17(金) 01:17:03
enum{s=9e9};
はなんとなく暗黙の型変換が行われそうだけど、
C++の規格的にはどうなんだろう?
ダメなら const int s=9e9; だね。

9<<9e9 も VC2005 ではエラーになるけど、
もしかして規格的にはグレーだったりするのか?
0187デフォルトの名無しさん2009/04/17(金) 01:24:02
9e9で値が大きすぎるからエラーになる訳じゃなくて、
以下のように値が小さくてもVC2005だとエラーになる。

enum{s=1.0};
9<<1.0
0188デフォルトの名無しさん2009/04/17(金) 02:39:47
--*c;if(!*cはif(!--*cで、9e9は9<<9でどうか
■ このスレッドは過去ログ倉庫に格納されています