问题描述:
任意给定一个正整数N,求一个最小的整数M(M>1),使得M*N的十进制结果只含有1和0;
问题解答:
1.穷举法
for( M=2; ; M++)
{
if ( hasOnlyZeroAndOne(M*N))
{ cout; break;}
}
一旦N较大,比如N=99,M=1122334455667789,M*N=111,111,111,111,111
2.问题转换:
原问题可以转化为:求一个只含有1与0正整数,能被N整除;
观察X的取值:1,10, 11, 100, 101, 110, 111,1000……
再引入一个变量 j=X%N, 直接遍历X,
通过一个队列存储值和余数j,当j出现过时,乘以10,乘以10加1,跟余数相同的前面那个数效果一样,所以可以不计算。
#include <iostream>
#include <queue>
using namespace std;
struct QNode
{
int v,r;//v is value, r is remainder
QNode(int vv, int rr): v(vv), r(rr){}
QNode():v(0),r(0){}
};
int main()
{
int N;
while(cin>>N)
{
queue<QNode> q;
q.push(QNode(1,1));
while(