题目链接:AcWing1209. 带分数
题目:
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
题解: 用next_permutation函数枚举1~9的全排列,剪枝,代入数值判断是否满足条件。
用来存1~9数字的数组可以是int或char,若用string则会超时!
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[11];
inline int cal(int l, int r){
int res = 0;
for(int i = l; i <= r; ++i){
res = res * 10 + a[i];
}return res;
}
inline int callen(int x){
int res = 0;
while(x){
x /= 10;
res++;
}return res;
}
int main(){
ios::sync_with_stdio(0);
for(int i = 1; i <= 9; ++i)
a[i] = i;
int cnt = 0;
int n;
cin >> n;
int len = callen(n);
do{
for(int j = 1; j <= len; ++j){
for(int i = j+1; i < 9; ++i){
int n1 = cal(1, j), n2 = cal(j+1, i), n3 = cal(i+1, 9);
if(n1 > n)
break;
if(n3 % n2 == 0 && n1 + n3 / n2 == n)
cnt++;
}
}
}while(next_permutation(a+1, a+10));
cout << cnt << endl;
return 0;
}