いやいや、
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 件のコメント:
コメントを投稿