2013年3月19日火曜日

mのn乗回LOOPをまわす方法。

mのn乗回LOOPをまわす方法な件なんですけどねー。
いやいや、
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関数。
  1. typedef int (*func1)(int*,int);  
  2.   
  3. int countUp(int* dat,int mmm,int nnn){  
  4.     for(int w=0;w<nnn;w++){  
  5.         dat[w]++;  
  6.         if(dat[w] < mmm){  
  7.             return true;  
  8.         }  
  9.         dat[w] = 0;  
  10.     }  
  11.     return false;  
  12. }  
  13. int theFuncs(int* ip,int n){  
  14.     static int counter = 0;  
  15.     printf("<%d> ",counter++);  
  16.     for(int w=n-1;w>=0;w--){  
  17.         printf("[%d]",ip[w]);  
  18.     }  
  19.     printf("\n");  
  20.     return 0;  
  21. }  
  22. void loppFunc(int mmm,int nnn,func1 f){  
  23.     int* dat = new int[nnn];  
  24.     memset(dat,0,sizeof(int)*nnn);  
  25.     do{  
  26.         f(dat,nnn);  
  27.     }while( countUp(dat,mmm,nnn) );  
  28.     delete[] dat;  
  29. }  
  30. loppFunc(10,3,theFuncs);//呼び出し方  

ケタの数だけ、配列して、関数に渡します。←日本語おかしいな^^;^^;
まぁどんな言語でもいけるっちゃいけますけど、かなり用途は狭いでしょうし、、ホントに巨大な数だけLOOPするようなものを、C(C++)以外でつくることも、そうそうないでしょうし。
あ、すんません。Fortranとかは授業でしかやったことないんで^^;使ったことないっすー。。。

0 件のコメント:

コメントを投稿