暴力解法
1、先用dfs生成1-9的全排列
2、然后对得到的全排列进行分割,得到三个数
3、判断三个数是否可以组成带分数
#include<iostream>
using namespace std;
const int N = 10;
int n, res;
int num[N];
bool state[N];
int get(int l,int r){
int m =0;
for(int i=l;i<=r;i++){
m = m*10+num[i];
}
return m;
}
bool check(int a, int b, int c){
if((a + b/c) == n && b %c ==0) return true;
return false;
}
void dfs(int u){
if(u == N){ //等到取够9个数,就开始对全排列分割
for(int i=1;i<=7;i++){
for(int j=i+1;j<=8;j++){
int a = get(1, i);
int b = get(i+1, j);
int c = get(j+1,9);
// cout<<a<<" "<<b<<" "<<c<<endl;
if(check(a,b,c)) res++; //符合带分数的话, res++
}
}
return ;
}
for(int i=1;i<N;i++){ //dfs递归求1-9的全排列
if(!state[i]){
num[u] = i;
state[i] = true;
dfs(u+1);
state[i] = false;
num[u] = 0;
}
}
}
int main(){
cin>>n;
dfs(1); //参数1表示枚举到第几个位置
cout<<res<<endl;
return 0;
}
用next_permutation()函数生成全排列,其他同上个版本代码相同
next_permutation(start, end)参数1为数组首地址,参数2为数组尾地址
#include <iostream>
#include <algorithm>
using namespace std;
const int N=15;
int n,res=0;
int num[N]={0,1,2,3,4,5,6,7,8,9};
int get_num(int l,int r){
int m=0;
for(int i=l;i<=r;i++){
m = m*10+num[i];
}
return m;
}
bool check(int a,int b, int c){
if((a+b/c)==n && b%c ==0) return true;
else return false;
}
int main(){
cin>>n;
int a,b,c;
do{
for(int i=1;i<=7;i++){
for(int j=i+1;j<=8;j++){
a=get_num(1, i);
b=get_num(i+1, j);
c=get_num(j+1,9);
if(check(a,b,c)) res++;
}
}
}while(next_permutation(num+1,num+10));
cout<<res<<endl;
}