いやいや、
v = m * n;
for(int w=0;w<v;w++){
なんて、そんな話じゃないですよ。
だって、longとかlong longに収まる範囲でしかできない方法じゃダメなんですよ。
だからっていって、下手に再帰させるのもダメですよ。stackOverFlowもあるしね。
って、どんだけ大きな数を扱おうとしてるかって話でもなく、
ここでは、再帰よりも『美しく』codingしましょう。
ということで、やりかたはわからなかったのですが、
なんとなくcodingしてたら、案の定できました。
基本的には、タイガー計算機の如く、1ケタづつLOOPする変数を準備すればいいだけです。
まぁ制限としては、nもmもintの範囲っていうくらいの制限はありますが。^^;
で、できたのがこれ。
これなら、1000の1000乗のLOOPでもまわせます。そんなことしたら、おわりませんけど。
loopFuncが関数、countUpがサブの関数、theFuncsがテストなCallBack関数。
- typedef int (*func1)(int*,int);
- int countUp(int* dat,int mmm,int nnn){
- for(int w=0;w<nnn;w++){
- dat[w]++;
- if(dat[w] < mmm){
- return true;
- }
- dat[w] = 0;
- }
- return false;
- }
- int theFuncs(int* ip,int n){
- static int counter = 0;
- printf("<%d> ",counter++);
- for(int w=n-1;w>=0;w--){
- printf("[%d]",ip[w]);
- }
- printf("\n");
- return 0;
- }
- void loppFunc(int mmm,int nnn,func1 f){
- int* dat = new int[nnn];
- memset(dat,0,sizeof(int)*nnn);
- do{
- f(dat,nnn);
- }while( countUp(dat,mmm,nnn) );
- delete[] dat;
- }
- loppFunc(10,3,theFuncs);//呼び出し方
ケタの数だけ、配列して、関数に渡します。←日本語おかしいな^^;^^;
まぁどんな言語でもいけるっちゃいけますけど、かなり用途は狭いでしょうし、、ホントに巨大な数だけLOOPするようなものを、C(C++)以外でつくることも、そうそうないでしょうし。
あ、すんません。Fortranとかは授業でしかやったことないんで^^;使ったことないっすー。。。
0 件のコメント:
コメントを投稿