题目大意:
题意很清楚:求一个整数表示成带分数形式的种数。
分析:
看到这个题目,第一反应是暴力找出整数部分 a a a,分子部分 b b b,分母部分 c c c,看看哪一组 a + b c a+\frac{b}{c} a+cb 刚好等于 n n n。
但是这样做比较麻烦,所以我们有一种新的办法。
通过观察,我们不难发现:每个组成带分数的数字正好是 1 ∼ 9 1 \sim9 1∼9,那么我们只要枚举 1 ∼ 9 1\sim9 1∼9 中的数字的全排列,再进行验证,是不是就筛选出了答案的种数呢?
而且,题目还说了,只需要求种数,所以就不需要把每一个数字都求出来了。
实现:
先说一句,求全排列有两种方式:一种是暴力搜索,一种是直接用函数 next_permutation
。
个人推荐第二种,好用还不会写错。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[10];
int work(int l, int r){
int sum=0;
for (int i=l; i<=r; i++)
sum=sum*10+a[i];
return sum;
}//验证
int t,n;
int main(){
for (int i=0; i<10; i++) a[i]=i+1;
scanf("%d", &n);
int ans=0;
do {
for (int i=0; i<7; i++){
int x=work(0, i);
if (x>n) break;
for (int j=i+1; j<8; j++){
int y=work(i+1, j), z=work(j+1, 8);
if (y%z==0 && x+y/z==n) {
ans++;//满足条件则答案+1
}
}
}
} while (next_permutation(a, a+9));//全排列
printf("%d\n", ans);
return 0;
}