题目描述
100 可以表示为带分数的形式:
100
=
3
+
69258
714
100=3+\frac{69258}{714}
100=3+71469258
还可以表示为:
100
=
82
+
3546
197
100=82+\frac{3546}{197}
100=82+1973546
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
思路
这是一道递归题,分三部分
- 把1~9所有数字的全排列枚举出来(用dfs)
- 分成三段,分别赋给a,b,c
- 验证是否满足 a × c + b = = n × c a \times c+b ==n \times c a×c+b==n×c,满足就计数+1
完美!!! 下面上代码
代码
#include <iostream>
using namespace std;
const int N=10;
int n,cnt;
int ans[N];
bool st[N];
int get_num(int l,int r)
{
int sum=0;
for(int i=l; i<=r; i++)
sum=sum*10+ans[i];
return sum;
}
void dfs(int u)
{
if(u>9)
{
for(int i=1; i<=7; i++)
{
for(int j=i+1; j<=8; j++)
{
int a,b,c; //第二步
a=get_num(1,i);
b=get_num(i+1,j);
c=get_num(j+1,9);
if(a*c+b==n*c) //第三步
cnt++;
}
}
return ;
}
for(int i=1; i<=9; i++) //第一步
{
if(!st[i]) //要判断是否用过这个数
{
st[i]=true;
ans[u]=i;
dfs(u+1);
st[i]=false;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
}