『プログラミングの美』は条件に合致する整数のC言語を探して実現します


『プログラミングの美しさ』2.8条件に合った整数を探す.任意に1つの正の整数Nを与えて、1つの最小の正の整数M(M>1)を求めて、N*Mの10進数の表現形式の中でただ1と0だけを含みます.
著者らは問題の解析を経て,計算の2つの数の乗算結果を余数情報の処理に変えた.アルゴリズム思想の変換により問題の処理過程を簡略化し,残数を処理する過程で中間過程の残数情報を保存することで,効率を浪費する大量のモード演算を回避した.また,要求される結果が大きい可能性があるため,bitビットマップ方式を採用し,対応するbitビットが1であるフラグ10進数が有値であり,プログラムが処理できる範囲を拡張できる.
#include <stdio.h>

int iRes[100];		/* bitmap */

int OneAndZeroNum(int N)
{
	int i, X;		/* X             */
	int num;		/* num = 10^X */
	for(i = 0; i < N; i++)
		iRes[i] = 0;
	for(X = 0, num = 1; ; X++, num *= 10)
	{
		int tempRes = num % N;
		if(tempRes != 0)	/*   10^X    N */
		{
			if(iRes[tempRes] == 0)
				iRes[tempRes] = 1 << X;	/*    tempRes ,        */
			for(i = 1; i < N; i++)		/*             */
				if(iRes[i] != 0 && iRes[(i+tempRes)%N] == 0 && \
						((iRes[i] & (1 << X)) == 0)) /*          */
					iRes[(i+tempRes)%N] |= (iRes[i] | (1 << X));
			if(iRes[0] != 0)
				return iRes[0];
		}
		else
		{
			iRes[0] = 0;
			iRes[0] |= 1 << X;
			return iRes[0];
		}
	}
	return 0;
}

int main()
{
	int N;
	int iBitMapNum, iFactor;
	int Num;
	while(1)
	{
		scanf("%d", &N);
		iBitMapNum = OneAndZeroNum(N);
		iFactor = 1;
		Num = 0;
		while(iBitMapNum)
		{
			Num += (iBitMapNum & 0x01) * iFactor;
			iFactor *= 10;
			iBitMapNum >>= 1;
		}
		printf("%d
", Num); } return 0; }