带分数
题意
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。类似这样的带分数,100 有 11 种表示法。
输入一个数求出一共有多少种表达方式
思路
- 将1—9全排列
- 讲全排列的数划分成3段数
- 判断是否成立
坑点
- 分子分母都不为0
- 分数可整除
算法一:全排列+搜索
时间复杂度
3 m s 3ms 3ms
实现步骤
- 完成1到9的全排列
- 确定数的左段点和右端点转化为一个完整的数
- 依次判断是否成立
代码
#include<bits/stdc++.h>
//#define int long long int
using namespace std;
int ans,n;
int num[15];
int st[15];
int W(int x,int y)//将一段数转化为一个数
{
int res=0;
for(int i=x;i<=y;i++)
{
res=res*10+num[i];
}
return res;
}
void dfs(int u)
{
if(u>9)//到达边界枚举3段check
{
for(int i=1;i<=7;i++)
{
for(int j=i+1;j<=8;j++)
{
int a=W(1,i);
int b=W(i+1,j);
int c=W(j+1,9);
if(a+b/c==n&&b%c==0&&b!=0)//如果满足条件
{
ans++;
}
}
}
return ;
}
for(int i=1;i<=9;i++)//将1到9进行全排列
{
if(st[i]==0)
{
num[u]=i;//将i存入队列
st[i]=1;//判断为使用过
dfs(u+1);//进行下一位数的搜索
st[i]=0;//判断为未使用
}
}
}
signed main()
{
scanf("%d",&n);
dfs(1);//从1开始搜索
cout<<ans<<endl;
return 0;
}
总结
理清思路利用全排列模拟