开始没思路,但是仔细思考一下,发现可以枚举,然后找一下上界和下界,可以知道范围并不大。我的枚举量是将近50000的样子,书上说枚举量可以降低到10000……没懂,再想一下
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <map> 6 using namespace std; 7 map<int, bool> mymap; 8 void solve(int i) { 9 while (i) { 10 mymap[i%10] = true; 11 i /= 10; 12 } 13 } 14 void init() { 15 int n, i, j; 16 while (~scanf("%d", &n)) { 17 for (i = 1200; i < 50000; ++i) { 18 if ((i*n)/10000 == 0 || (i*n)/10000 >= 10) continue; 19 mymap.clear(); 20 solve(i); solve(i * n); 21 if (i/10000 == 0) mymap[0] = true; 22 for (j = 0; j < 10; ++j) { 23 if (!mymap[j]) break; 24 } 25 if (j == 10) printf("%05d / %05d = %d\n", i*n, i, n); 26 } 27 } 28 } 29 30 int main(void) { 31 freopen("7.1.1.in", "r", stdin); 32 init(); 33 return 0; 34 }
注意一下21行,就是当枚举的 i 的值是四位数字的时候,要把0标记。