思想:暴力dfs,优化后时间还可以,这个题目其实就是求a+b/c=n这个等式成立有几种情况。全排列,然后将数组分为3段区间,第一段a,第二段b,第三段c。
有两个需要注意的地方。
注意c++的除法是有精度误差的,所以我们需要转化为乘法来求。
还有一个地方,若n是k位数,则a最多就是k位,可以减少部分循环。
#include<iostream>
using namespace std;
const int N=10;
int a[N];//记录从1到9
bool used[N];//记录i有没有被用过
int cnt;//计数
int k;//记录n是几位数
int n;
int cal(int l,int r)
{
int res=0,i=0;
while(l<=r)
{
res=res*10+a[l++];
}
return res;
}
void dfs(int u)
{
if(u>9)
{
for(int i=1;i<=k;i++)
{
//血泪教训,一直觉得k位数a最大是k-1位 ,应该是k位
//比如25最大就是两位
for(int j=i+1;j<9;j++)
{
int a=cal(1,i);
int b=cal(i+1,j);
int c=cal(j+1,9);
if(a*c+b==c*n)//c++除法有误差
{
//测试用 cout<<a<<"+ "<<b<<"/"<<c<<endl;
cnt++;
}
}
}
}
for(int i=1;i<=9;i++)
{
if(!used[i])
{
a[u]=i;
used[i]=true;
dfs(u+1);
used[i]=false;
}
}
}
int main()
{
cin>>n;
int tmp=n;
while(tmp)
{
k++;
tmp/=10;
}
dfs(1);
cout<<cnt<<endl;
return 0;
}