単位分解
各単位に数を振り分ける
ある値 i のなかに単位 x がいくつあるのかを知りたいとする
このアルゴリズムは、金銭管理などの事務処理でもっとも基本的な算法です
紙幣は1円や10円というように、単位ごとに分解できます
秒数もまた、分や時間というような単位ごとに分解できますね
ある値 i を指定した単位 x に分解するには、iをxで割ります
それ以下の単位を得るには、iのxの剰余を得て、それを同様の方法で算術します
a = i / x;
aがiをxの単位に分解した値になります
このアルゴリズムを用いれば、金額に対する紙幣の最適化や(テーブルゲームなどで使えますね☆)
ある時刻から経過した秒数から、現在時間を得るなどのプログラムを作成できます
/*日本紙幣構造体*/
typedef struct {
int en10000;
unsigned en5000: 1;
unsigned en2000: 2;
unsigned en1000: 3;
unsigned en500: 1;
unsigned en100: 3;
unsigned en50: 1;
unsigned en10: 3;
unsigned en5: 1;
unsigned en1: 3;
} JP_MONEY;
/*日本紙幣最適化ルーチン*/
void getMoneyUnit(JP_MONEY *m , unsigned long value) {
m->en10000 = value / 10000;
value %=10000;
m->en5000 = value / 5000;
value %= 5000;
m->en2000 = value / 2000;
value %= 2000;
m->en1000 = value / 1000;
value %= 1000;
m->en500 = value / 500;
value %= 500;
m->en100 = value / 100;
value %= 100;
m->en50 = value / 50;
value %= 50;
m->en10 = value / 10;
value %= 10;
m->en5 = value / 5;
value %= 5;
m->en1 = value /1;
}
このモジュールは、お金を扱うJP_MONEY構造体型と
JP_MONEYの各メンバに、指定された金額から振り分けた単位を代入する関数です
モジュールとして孤立させているので、このように長くなりましたが
同じファイル内での振り分けであれば、配列とループを使って
簡単に表現できるのが、上のプログラムを見てもわかると思います