目录
题目
题目思路
题目代码
注解:
1.题目给定的判定条件为
2.关于next_permutation(start,end);
题目:
题目思路:
因为题目要求是满足在1到9中
不重复、不遗漏的所有满足条件的情况
所以我们可以通过全排列
把整数、分子、分母
能取的数字全部枚举出来
然后判断是否满足条件
从而找到带分数的全部总数
题目代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int arr[]={0,1,2,3,4,5,6,7,8,9};//最小排序
int trans(int l,int r){//把数组分割的区间的数字 转化为 整数
int sum=0;
for(int i=l;i<=r;i++){
sum*=10;
sum+=arr[i];
}
return sum;
}
int main(){
scanf("%d",&n);
int ans=0;
do{
for(int i=1;i<=7;i++)//取三项,分别表示 分数前整数、分子、分母
{
for(int j=i+1;j<=8;j++){
int inter=trans(1,i);
int fz=trans(i+1,j);
int fm=trans(j+1,9);
if(0==inter||0==fz||0==fm) continue;
if(n*fm==inter*fm+fz){
ans++;
}
}
}
}while(next_permutation(arr+1,arr+10));//下一个排类(默认按照数字大小)
printf("%d",ans);
return 0;
}
注解:
1.题目给定的判定条件为
数字=整数+分子/分母
因为涉及到除法
有些情况会出现小数,不方便判断
所以把条件转换为
数字*分母=整数*分母+分子
2.关于next_permutation(start,end);
next_permutation(start,end); 是取从start到end序列的下一个排列 例如: arr[]={1 2 3 4 5} 它的next_permutation(arr,arr+5) 为1 2 3 5 4 默认按照字典序大小取排序下一位 注: 1.也可以根据需要自定义排序方法 2.prev_permutation(start,end)是取从start到end序列的上一个排列
PS: 今人不见古时月,近月曾经照古人