带分数
算法描述
问题描述
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 }

浙公网安备 33010602011771号