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関数。
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 件のコメント:

コメントを投稿