题意很简单,给定一个n, 求一个最小的m,使得n_m中的10进制表示只有0,1
方法1:Brute Force [大整数的情况需要考虑,何时终止,时间复杂度如何?]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
bool CheckNumber(int number)
{
while(number)
{
if (number%10 != 0 && number%10 != 1)
return false;
number /= 10;
}
return true;
}
int CalcMBruteForce(int n)
{
int m = 1;
while (!CheckNumber(m * n))
{
m++;
}
return m;
}
|
方法2:BFS [大整数的情况需要考虑,何时终止,去重复计算问题]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
int CalcM(int number)
{
int i = 1;
vector<int> vList;
vList.clear();
vList.push_back(0);
vList.push_back(1);
vector<int> vListC;
int k = 1;
// TODO:
// BigInt
// Delete duplicate
while (true)
{
vListC.clear();
for (vector<int>::size_type i = 0; i < vList.size(); i++)
{
if (vList[i] && vList[i] % number == 0)
{
return vList[i];
}
vListC.push_back(vList[i] + 0);
vListC.push_back(vList[i] + (int)pow(10.0, k));
}
vList.clear();
vList = vListC;
k++;
}
}
|