Contents
  1. 1. 题目:
  2. 2. 分析:

题目:

  给你一个数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;
}
Contents
  1. 1. 题目:
  2. 2. 分析: