単位分解


各単位に数を振り分ける

ある値 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の各メンバに、指定された金額から振り分けた単位を代入する関数です

モジュールとして孤立させているので、このように長くなりましたが
同じファイル内での振り分けであれば、配列とループを使って
簡単に表現できるのが、上のプログラムを見てもわかると思います



前のページへ戻る次のページへ