フィボナッチ数列(awk版)

さて、以前の問題をperlで解いていましたが、awkで解き直してみました。

まずは、これ。

utthi-fumi.hatenablog.com

#!/usr/bin/gawk -f

BEGIN{
    PREC = 100;
    before = 0;
    cnt = 0;
    n = 1;
    while(1){
        fibona = fibo(n);
        fibo_div = fibona / sp(fibona);
        if(fibo_div == int(fibo_div)){
            cnt++;
            if(cnt > 7){
                print fibona;
            }
            if(cnt > 11){
                break;
            }
        }
        n++;
    }
}

function fibo(num){
    if(memo[num] == ""){
        if((num == 0) || (num == 1)){
            memo[num] = 1;
        }else{
            memo[num] = fibo(num - 2) + fibo(num - 1);
        }
    }
    return memo[num];
}

function sp(n,  ret,total){
    split(n,ret,"");
    total = 0;
    for (i in ret){
        total += ret[i];
    }
    return total;
}

PRECというのは精度で数字が高ければ正確な精度が出る(と思う)
今回はPREC=100で計算。

実行時は-Mオプションを忘れずに。

gawk -M -f q11.awk 
2584
14930352
86267571272
498454011879264
160500643816367088

もし、PRECをソースコードに入れなければ、下記のようにしても良い。

gawk -M -v PREC=100 -f q11.awk 
2584
14930352
86267571272
498454011879264
160500643816367088

-Vオプションは変数代入に使う。