一道算法设计题,我想了半天,只会用快乐蛮力法求解,不知道发发博客会不会有大神说一说更加好的算法~
我的算法思路:
已知解空间,第一个数12-98,第二个数123-987,结果不会超过9999.直接遍历整个解空间去找结果。
按理来说,这遍历的 □□ 与 □□□ 不会超过一半范围的,要不然 □□□□会溢出,我直接用最大的解空间去遍历也可以(主要是这样算解空间清晰一点,缩小解空间没办法让时空复杂度有阶梯性的变化我没改)
#include<iostream>
using namespace std;
//蛮力法
bool check(int numberLeft, int numberRight, int result)
{
int a[10] = { 0 };
int tmf = 0;
a[numberLeft / 10] ++;
a[numberLeft % 10] ++;
a[numberRight % 10] ++;
a[numberRight / 10 % 10] ++;
a[numberRight / 100] ++;
a[result % 10] ++;
a[result / 10 % 10] ++;
a[result/ 100 % 10] ++;
a[result / 1000] ++;
if (a[0] == 0) {
for (int i = 1; i < 10; i++)
{
if (a[i] == 1)
tmf++;
}
if (tmf == 9)
return true;
else
return false;
}
else
return false;
}
bool find() {
for (int numberLeft = 12; numberLeft < 99; numberLeft++)
for (int numberRight = 123; numberRight < 988; numberRight++) {
int result = numberLeft * numberRight;
if (result > 9999) break;
if (check(numberLeft, numberRight, result)) cout << numberLeft << " * " << numberRight << " = " << result << endl;
}
return true;
}
int main()
{
find();
return 0;
}