Title

带分数

算法描述

问题描述

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 #include<iostream>
 2 using namespace std;
 3 
 4 int visit[10] = { 0 };//作为是否已被取的标志
 5 int s[10];
 6 int ans = 0;
 7 int N;
 8 void found(int s[])//目的,得到满足条件的x,y,z
 9 {
10     int x, y, z;
11     for (int i = 1; i < 9; i++)//对于要对三个变量,在一个范围内,可参考下面的方式
12     {
13         for (int j = i + 1; j < 9; j++)
14         {
15             x = y = z = 0;
16             for (int k = 0; k < 9; k++)
17             {
18                 if (k < i)x = x * 10 + s[k + 1];
19                 else if (k < j)y = y * 10 + s[k + 1];
20                 else z = z * 10 + s[k + 1];
21             }
22             if (y % z == 0 && x + y / z == N)
23             {
24                 /*cout << x << " " << y << " " << z << " " << endl;*/
25                 ans++;
26             }
27         }
28     }
29 }
30 
31 void dfs(int pos, int n)//通过dfs(深度搜索),得到1~9的全排列
32 {
33     if (pos == n)
34         found(s);
35     else
36     {
37         for (int i = 1; i <= 9; i++)
38         {
39             if (!visit[i])
40             {
41                 s[pos] = i;
42                 visit[i] = 1;
43                 dfs(pos + 1, n);
44                 visit[i] = 0;
45             }
46         }
47     }
48 }
49 int main()
50 {
51     cin >> N;
52     dfs(1, 10);
53     cout << ans << endl;
54     return 0;
55 }

 

posted @ 2020-10-29 11:15  WAASSTT  阅读(450)  评论(0)    收藏  举报
Title