描述:
对于每个输入的数字(如:2),则要求 给出一个由1,0构成的十进制整数,且该整数为输入数字的某个倍数,且是满足该条件的最小数(如2对应的10)。
输入:
数字n,n等于0时停止。
输出:
n的一个满足条件的最小倍数。
输入样例:
2 0
输出样例:
10
#include <iostream>
#include <algorithm>
using namespace std;
int all[20]; //枚举所有可能
int n;
int flag;
void check()
{
//第一个非零数
int p = 0;
while(all[p] == 0 && p < 20)
p++;
//全0
if(p == 20)
return;
if(p == 19)
{
if(n == 1)
{
flag = 1;
cout << 1 << endl;
return;
}
}
else
{
int i, mod = 0;
for(i = p; i < 20; i++)
{
mod = (mod*10+all[i])%n;
}
if(mod == 0)
{
flag = 1;
for(i = p; i < 20; i++)
{
cout << all[i];
}
cout << endl;
}
}
}
void Search(int m)
{
if(flag == 1) //找到目标,不必枚举可能
return;
if(m == 20)
{
check();
}
else
{
all[m] = 0;
Search(m+1);
all[m] = 1;
Search(m+1);
}
}
int main()
{
while(cin >> n && n)
{
flag = 0;
Search(0);
}
}
另外给一个超时的代码:
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int ans[100];
bool bin(int i, int n)
{
stack<int> s;
while(i)
{
if(i % 2 == 1)
s.push(1);
else
s.push(0);
i /= 2;
}
int k = 0;
while(!s.empty())
{
ans[k++] = s.top();
s.pop();
}
int flag = 0;
for(int j = 0; j < k; j++)
{
flag = (flag*10+ans[j])%n;
}
if(flag == 0)
{
for(int j = 0; j < k; j++)
cout << ans[j];
cout << endl;
return true;
}
else
return false;
}
int main()
{
int n;
while(cin >> n && n)
//for(int n = 2; n < 100; n ++)
{
for(int i = 1; i < 1000000; i++)
{
if(bin(i, n))
break;
}
}
}