あめみやしろぐ

お仕事(院内SE)のことをかいたり思いついたことをかいたりします。

3が付く数字のときだけ出力します

世界のナベアツ(古いな)ではない。

いつものようにtwitterで時間を潰していたらこんなtweetを見かけた。

 

ひねくれ者なので、「文字列で処理しないコード」を書きたくなる。

考え方としてはこうだ。

・f(x)=0(0≦x≦9),1(10≦x≦19),2(20≦x≦29),,,9(90≦x≦99),10(x=100)とする。
・同様にg(x)=x(0≦x≦9),x-10(10≦x≦19),,,x-90(90≦x≦99),x-100(x=100)とする。

・これによって1~100までの整数はa(x)=10f(x)+g(x),(0≦x≦100)として表現できる。

・「3がつく数字」とは10の位が3で割って商が1余り0となる数字、または1の位が3で割って商が1余り0となる数字である。

 

というわけで、Pythonの勉強も兼ねて以下のようなコードを書いてみた。

#1~100の整数から3がつく数だけを出力する
 
def f(x):
    if 0 <= x <= 9:
        return 0
    elif 10 <= x <= 19:
        return 1
    elif 20 <= x <= 29:
        return 2
    elif 30 <= x <= 39:
        return 3
    elif 40 <= x <= 49:
        return 4
    elif 50 <= x <= 59:
        return 5
    elif 60 <= x <= 69:
        return 6
    elif 70 <= x <= 79:
        return 7
    elif 80 <= x <= 89:
        return 8
    elif 90 <= x <= 99:
        return 9
    elif x == 100:
        return 10

def g(x):
    if 0 <= x <= 9:
        return x
    elif 10 <= x <= 19:
        return x-10
    elif 20 <= x <= 29:
        return x-20
    elif 30 <= x <= 39:
        return x-30
    elif 40 <= x <= 49:
        return x-40
    elif 50 <= x <= 59:
        return x-50
    elif 60 <= x <= 69:
        return x-60
    elif 70 <= x <= 79:
        return x-70
    elif 80 <= x <= 89:
        return x-80
    elif 90 <= x <= 99:
        return x-90
    elif x == 100:
        return x-100

for x in range(101):
#第一判定;10の位を3で除した商が1、剰余0の場合のみ出力
    if divmod(f(x),3) == (1,0):
        print (10*f(x)+g(x))
#第二判定;1の位を3で除した商が1、剰余0の場合のみ出力
    elif divmod(g(x),3) == (1,0):
        print (10*f(x)+g(x))

 

はっきりいって無駄なことをしている、とわかってはいるけれど。