1.对整数部分从1~n-1进行搜索,用flag记录已经出现过的数字(!式子中不能出现0,出现给flag标记中的0赋值为1);
2.分数部分,分母一定小于分子,分母长度一定小于等于分子,即分子长度一定小于等于右边总长度的一半
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 10
bool flag[MAX],copyf[MAX];
int n,sum,r,len;
bool check(int n)
{
int m;
while(n){
m=n%10;
if (flag[m]) return false;
flag[m]=true;
n/=10;
len++;
}
return true;
}
bool Ans(int num,int molecule)
{
for (int i=1;i<MAX;i++){
copyf[i]=flag[i];
}
int s=0,m;
while (molecule)
{
m=molecule%10;
if (copyf[m]) return false;
copyf[m]=true;
s++;
molecule/=10;
}
if (len-num==s){
return true;
}
return false;
}
void dfs(int num,int denominator)
{
if (num<=len/2)
{
if (Ans(num,denominator*r))
{
sum++;
}
for (int i=1;i<MAX;i++)
{
if (!flag[i])
{
flag[i]=true;
dfs(num+1,denominator*10+i);
flag[i]=false;
}
}
}
}
int main()
{
while(cin>>n)
{
sum=0;
for (int i=1;i<n;i++)
{
len=0;
memset(flag,0,sizeof(flag));
flag[0]=1;
if (check(i))
{
r=n-i;
len=9-len;
dfs(0,0);
}
}
cout<<sum<<endl;
}
return 0;
}