问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
//法一
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9},
N, ans;
int getSum(int lh, int rh)
{
int sum = 0;
for (int i = lh; i <= rh; i++)
{
sum = sum * 10 + num[i];
}
return sum;
}
void check()
{
for (int i = 0; i < 9; i++)
{
int a = getSum(0, i);
if (a > N) continue;
for (int j = i + 1; j < 8; j++)
{
int b = getSum(i + 1, j);
int c = getSum(j + 1, 8);
if (b >= c && b % c == 0 && (a + b/c == N)) {
ans++;
}
}
}
}
void solve()
{
cin >> N;
do {
check();
} while(next_permutation(num, num + 9));
printf("%d
", ans);
}
int main()
{
solve();
return 0;
}
//法二
1 #include <algorithm>
2 #include <cstring>
3 #include <queue>
4 #define INF 0x3f3f3f3f
5 #define MAXN 100005
6 #define Mod 10001
7 using namespace std;
8 int vis[10], n , ans;
9 int num[10];
10
11
12 int getSum(int lh, int rh)
13 {
14 int sum = 0;
15 for (int i = lh; i <= rh; i++) {
16 sum = sum * 10 + num[i];
17 }
18 return sum;
19 }
20
21 void check()
22 {
23 for (int i = 1; i <= 9; i++) {
24 int a = getSum(1, i);
25 if (a > n) continue;
26 for (int j = i + 1; j < 9; j++) {
27 int b = getSum(i + 1, j); //[i+1, j]
28 int c = getSum(j + 1, 9); //[j+1, 9]
29 if (b >= c && b % c == 0 && a + b/c == n) {
30 ans++;
31 }
32 }
33 }
34 }
35
36 void dfs(int step)
37 {
38 if (step == 10) {
39 check();
40 }
41 else {
42 for (int i = 1; i <= 9; i++) {
43 if (!vis[i]) {
44 num[step] = i;
45 vis[i] = 1;
46 dfs(step + 1);
47 vis[i] = 0;
48 }
49 }
50 }
51
52 }
53
54 int main()
55 {
56 scanf("%d", &n);
57 ans = 0;
58 memset(vis, 0, sizeof(vis));
59 dfs(1);
60 printf("%d
", ans);
61 return 0;
62 }
//这里补充一个next_permutation()的用法
//蓝桥杯 2015省赛 第3题 三羊献瑞
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b, c;
int d;
void solve()
{
do {
b = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];
c = a[4]*1000 + a[5]*100 + a[6]*10 + a[1];
d = a[4]*10000 + a[5]*1000 + a[2]*100 + a[1]*10 + a[7];
// if (b + c == d) {
// cout << b << " + " << c << " = " << d << endl;
// }
} while (next_permutation(a, a + 10));
}
int main()
{
solve();
return 0;
}
//发现好多蓝桥杯省赛的题目 都可以用 next_permutation()轻松解决..
//还有之前整理的一个题目: http://www.cnblogs.com/douzujun/p/6669303.html