以前 N進数の計算をするという問題で鬼苦労
関数型プログラムをしている今なら!
目標
任意の進数で足し算、引き算
制作過程
0〜Zまでの文字列作成
36進数までのサポートが確定
plusOneを作成
必要 文字列の任意の位置の変更関数
追加関数テスト
plusOneをテスト
minusOneを作成とテスト
plusを作成、plusOneを足す分ループ
必要 N進数から10進数への変換関数
変換関数テスト
minusを作成
全体的なテスト(完成)
未対応項目
マイナスで0以下
進数意外の文字エラー
桁あふれ
etc....
感想
32進数"VVVVV"を足すなどでも遅い。小学校でならった繰り上げ、繰り下げなどを実装しないとダメらしい。
lineAddまったく使ってなかった。



コピペできるソース
関数型プログラムをしている今なら!
目標
任意の進数で足し算、引き算
制作過程
0〜Zまでの文字列作成
36進数までのサポートが確定
plusOneを作成
必要 文字列の任意の位置の変更関数
追加関数テスト
plusOneをテスト
minusOneを作成とテスト
plusを作成、plusOneを足す分ループ
必要 N進数から10進数への変換関数
変換関数テスト
minusを作成
全体的なテスト(完成)
未対応項目
マイナスで0以下
進数意外の文字エラー
桁あふれ
etc....
感想
32進数"VVVVV"を足すなどでも遅い。小学校でならった繰り上げ、繰り下げなどを実装しないとダメらしい。
lineAddまったく使ってなかった。



コピペできるソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | numStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" def strPoint(s,l,w): return s[:l]+w+s[l+1:] print(strPoint("0123456789",0,"X")) print(strPoint("0123456789",9,"X")) print(strPoint("0123456789",5,"X")) def lineAdd(w): global numStr return numStr[numStr.find(w)+1] def plusOne(s,base,l=None): global numStr if l==None:l=len(s)-1 if l<0: return numStr[1]+s num=numStr.find(s[l]) if num==base-1: s=strPoint(s,l,numStr[0]) return plusOne(s,base,l-1) else: return strPoint(s,l,numStr[num+1]) def minusOne(s,base,l=None): global numStr if l==None:l=len(s)-1 if l<0: return numStr[1]+s num=numStr.find(s[l]) if num==0: s=strPoint(s,l,numStr[base-1]) return minusOne(s,base,l-1) else: if num==1 and l==0: return s[1:] else: return strPoint(s,l,numStr[num-1]) """ n="0" for i in range(100): print(n) n=plusOne(n,16) n="0" for i in range(100): print(n) n=plusOne(n,2) n="0" for i in range(100): n=plusOne(n,32) print(n) for i in range(100): n=minusOne(n,32) print(n) """ def baseToInt(s,base,l=None,ret=None): global numStr if l==None:l=0 if ret==None:ret=0 if l==len(s)-1:return ret*base+numStr.find(s[l]) return baseToInt(s,base,l+1,ret*base+numStr.find(s[l])) print(baseToInt("FFFFFFFF",16)) print(baseToInt("FFFFFFFFFFFFFFFF",16)) def plus(s1,s2,base): for i in range(baseToInt(s2,base)): s1=plusOne(s1,base) return s1 def minus(s1,s2,base): for i in range(baseToInt(s2,base)): s1=minusOne(s1,base) return s1 print(plus("F0F0","F0F",16)) print(minus("F0F0","F0F",16)) print(minus("10000000","1",32)) print(minus("VVVVVV","VVVV",32)) print(baseToInt("VVVVV",32)) print(baseToInt("ZZZZZ",36)) print(minus("1000","1",8)) |
syntax2html |