1. 寻找符合条件的整数
任意给定一个正整数N,求一个最小的正整数M,是的N*M十进制中仅仅包含了1和0。
/若N=6.若N*M=K则有
1. 搜索K的最高位,最高位必须是1,此时k=1,k%N=1
2. 搜索下一位,下一位可以是0也可是1,则有(k*10+0)%N=10%6=4,(k*10+1)%N=5
3. 在搜索下一位:下一位可以是0也可是1,有
(10*0+0)%N=100%N 101%N 110%6 111%6
4 在搜索下一位
1000%6!=0
1001%6!=0
1010%6!=0
1011%6!=0
1100%6!=0
1101%6!=0
1110%6==0 所以1110就是所求的N*M
总结方法:
将余数逐层存储:
Mod[1...C]={1,4,5,4,5,2,3,4,5,2,3,2,3,0}
上述余数表明在得到余数0时候,进行了14次的乘以10的操作,故n很大的时候,容易溢出。
同余模定理如下
(a*b)%n=(a%n*b%n)%n
(a+b)%n=(a%n+b%n)%n
则可以有mod[i]=(mod[i-1]*10+i%2)%N
代码清单
#define N 1000
int mod[N];
int _tmain(int argc, _TCHAR* argv[])
{
int n;
cin>>n;
mod[1]=1;
int i;
for(i=2;mod[i-1]!=0;i++)
mod[i]=(mod[i/2]*10+i%2)%n;
i--;
int pm=0;
while(i)
{
mod[pm++]=i%2;
i=i/2;
}
while(pm)
{
cout<<mod[--pm];
}
cout<<endl;
return 0;
}