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