您的位置:首页 > 其它

寻找符合条件的整数

2013-09-03 19:11 253 查看
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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: