使用next_permutation的写法
…#include[HTML_REMOVED]
using namespace std;
int number[9];//储存1~9这9个数字的排列
int compute(int left, int right) {//计算数组number的[left,right]区间所表示的数的值
int a = 0;
for (int i = left; i <= right; i)
a = a * 10 + number[i];
return a;
}
int main(){
for(int i=0;i<9;i)
number[i]=i+1;
int N,ans=0;
scanf(“%d”,&N);
do{
for (int i = 0; i < 7; i)//分割带分数的整数部分
for (int j = i + 1; j < 8; j) {//分割带分数的分子分母
int a = compute(0, i), b = compute(i + 1, j), c = compute(j + 1, 8);//计算带分数的整数、分子、分母的值
if (b % c != 0 || a + b / c != N)//分子不能整除分母或者当前带分数值不等于N
continue;//重新进行循环
++ans;//递增种类数
}
}while(next_permutation(number,number+9));
printf(“%d”,ans);
return 0;
}…
不使用的代码(DFS)
`#include[HTML_REMOVED]
using namespace std;
bool visited[10]={false};//1~9这9个数字哪些数字已被使用
int number[9];//储存1~9这9个数字的排列
int ans = 0;//ans为最后输出的种类数
int compute(int left, int right) {//计算数组number的[left,right]区间所表示的数的值
int a = 0;
for (int i = left; i <= right; i)
a = a * 10 + number[i];
return a;
}
void DFS(int index, int N) {//当前需要排列的是number[index],N为输入的数字
if (index == 9) {////找到了1~9这9个数字的一个排列
for (int i = 0; i < 7; i)//分割带分数的整数部分
for (int j = i + 1; j < 8; j) {//分割带分数的分子分母
int a = compute(0, i), b = compute(i + 1, j), c = compute(j + 1, 8);//计算带分数的整数、分子、分母的值
if (b % c != 0 || a + b / c != N)//分子不能整除分母或者当前带分数值不等于N
continue;//重新进行循环
ans;//递增种类数
}
return;//返回上一层
}
for (int i = 1; i < 10; ++i)//遍历1~9这9个数
if (!visited[i]) {//当前遍历到的数还没有使用过
visited[i] = true;//置当前遍历到的数已使用
number[index] = i;//将当前遍历到的数填充到number[index]位置
DFS(index + 1, N);//进行下一层遍历
visited[i] = false;//置当前遍历到的数没使用,遍历下一个数
}
}
int main(){
int N;
scanf(“%d”,&N);
DFS(0,N);
printf(“%d”,ans);
return 0;
}`