By
yusijia
Updated:
题目:
给你一个数n(2 <= n <= 79),将0-9这十个数字分成两组组成两个5位
数a, b(可以包含前导0,如02345也算),使得a / b = n;列出所有的可能答案。
例如:
62
79546 / 01283 = 62
94736 / 01528 = 62
分析:
a / b = n,所以b比a小,枚举b,范围:(1000, 10000),实际是(1234,9876) 开一个标记数组,检查
是否10个数字都用到了
注意:如果只是简单的枚举10个数字,则枚举量是10! = 3628800,而上面的方法降低到
不到1万
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std;
int used[10] = {0};
int istrue(int a, int b) { if(b > 98765) return 0; memset(used, 0, sizeof(used)); if(a < 10000) used[0] = 1; while(a){ used[a % 10] = 1; a /= 10; } while(b){ used[b % 10] = 1; b /= 10; } int sum = 0; for(int i = 0; i < 10; i++) sum += used[i]; return (sum == 10); }
int main() { int n; while(scanf("%d", &n) != EOF && n){ int counts = 0; for(int i = 1234; i < 10000; i++){ if(istrue(i, i * n)){ printf("%05d / %05d = %d\n", i * n , i, n); counts++; } } if(!counts) printf("No solution!\n"); } return 0; }
|