10進数で回分(awk)
逆から数字を読んでも同じ数になる数のことを「回分数」と呼びます。
例えば、「123454321」のような数のことをです。
問題
10進数、2進数、8進数のいずれかで表現しても回分数となる数のうち、10進数の10以上で最小の値を求めてください。
awkには10進数を8進数に変換するにはsprintf関数を使えば、出来ます。
しかし、10進数を2進数には変換する関数がありませんので、自分で実装するしかありません。
以下ソースです。
#!/usr/bin/awk -f BEGIN{ TRUE = 1; FALSE = 0; num = 11; while(TRUE){ if(jussin(num)){ if(nishin(num)){ if(hasshin(num)){ print num; exit; } } } num += 2; } } function jussin(n, new){ max = split(n,a,""); for(i = max; i >= 1; i--){ new = new a[i]; } if(new == n){ return TRUE; }else{ return FALSE; } } function nishin(n, number,kaibun,new){ number = n; while(n >= 2){ amari = n % 2; kaibun = amari kaibun; n = int(n / 2); } kaibun = n kaibun; max = split(kaibun,a,""); for(i = max; i >= 1; i--){ new = new a[i]; } if(kaibun == new){ return TRUE; }else{ return FALSE; } } function hasshin(n, new,a){ number = sprintf("%o",n); max = split(number,a,""); for(i = max; i >= 1; i--){ new = new a[i]; } if(new == number){ return TRUE; }else{ return FALSE; } }