历届试题 带分数
问题描述
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 }

浙公网安备 33010602011771号