历届试题 带分数

问题描述

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
 
全排列+暴搜 (条件):
1.num = x + y/z
2.x<num
3.y%z=0
4.y>z  y的长度>=z
 
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[10];
 4 bool vis[10];
 5 int sum = 0, num;
 6 void fun()
 7 {
 8     int x, y, z;                 //  表示为 x + y / z
 9     for (int i = 1; i <= 9; i++) // x的位数 , 从 1 到 i 获得 x 的值
10     {
11         x = 0;
12         for (int j = 1; j <= i; j++) //得到x的值
13             x = x * 10 + a[j];
14         if (x < num)
15         {
16             for (int j = (9 - i) / 2 + i; j <= 8; j++) // 对x后面的数位折半 确保 y > z 
17             {
18                 y = 0, z = 0;
19                 for (int k = i + 1; k <= j; k++) // 从 i+1 到 j 获得 y 的值
20                     y = y * 10 + a[k];
21                 for (int k = j + 1; k <= 9; k++) // 从 j+1 到 9 获得 z 的值
22                     z = z * 10 + a[k];
23                 if (y % z == 0 && x + y / z == num)
24                     sum++;
25             }
26         }
27     }
28 }
29 void dfs(int layer, int n)  // 全排列
30 {
31     if (layer == n)
32         fun();
33     else
34     {
35         for (int i = 1; i <= 9; i++)
36         {
37             if (!vis[i])
38             {
39                 a[layer] = i;
40                 vis[i] = 1;
41                 dfs(layer + 1, n);
42                 vis[i] = 0;
43             }
44         }
45     }
46 }
47 int main()
48 {
49     memset(a, 0, sizeof a);
50     memset(vis, 0, sizeof vis);
51     cin >> num;
52     dfs(1, 10);
53     cout << sum << endl;
54     return 0;
55 }
View Code

 

posted @ 2020-03-04 17:40  PeacefulGemini  阅读(265)  评论(0)    收藏  举报
回顶部