题目链接: https://www.acwing.com/problem/content/1211/
样例
输入样例1
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
法1
暴力枚举每个数字
C++ 代码
#include<iostream>
using namespace std;
int T;//定义将要判断的数
int a[10];//存放全排列的数组
bool used[10];//判重数组
int res;//存放最后的结果
int compute(int left,int right)//计算数组中的被枚举后的数字大小
{
int num=0;
for(int i=left;i<=right;i++)
{
num=num*10+a[i];
}
return num;
}
void dfs(int x)
{
if(x>9)
{
for(int i=1;i<=7;i++)//相当于在9个数里面插入两个隔板,以此来枚举三个数
for(int j=i+1;j<=8;j++)
{
int a=compute(1,i);
int b=compute(i+1,j);
int c=compute(j+1,9);
if(c*T==c*a+b)
res++;
}
return;
}
for(int i=1;i<=9;i++)//全排列9个数并存到a数组中
{
if(used[i]==0)
{
used[i]=1;
a[x]=i;
dfs(x+1);
used[i]=0;
a[x]=0;
}
}
}
int main()
{
cin>>T;
dfs(1);
cout<<res<<endl;
return 0;
}
法2
利用全排列枚举a,在a全排列函数里面再枚举c,再c的全排列里面判断a、b、c是否成立,成立则输出
C++ 代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T;//将要计算的数据
bool state[10];//判重数组
bool backup[10];//对判重数组的备份
int res;//存放结果
bool check(int a ,int c)
{
long long b = T * (long long)c - (long long)a * c;
//1.先判断a、b、c是否等于0
if(a==0||b==0||c==0)
return 0;
//2.给b的每个数字取出,判断之前是否出现过,且是否有0
memcpy(backup,state,sizeof state);
while(b)
{
int x=b%10;//取出个位
b=(b-x)/10;//删掉个位
//如果b有一位是0,或者之前某位数字在a或者b里面出现过
if(x==0||backup[x]==1)
return 0;
else
backup[x]=1;
}
//3.如果0~9有一位没出现就不成立
for(int i=1;i<=9;i++)
{
if(backup[i]==0)
return 0;
}
return 1;
}
void dfs_c(int u,int a,int c)//u是用了几个数字,a即a本身,c即c本身
{
if(u>9)//最多也就是8个数字
return;
if(check(a,c))//判断成立条件
res++;
for(int i=1;i<=9;i++)
{
if(state[i]==0)
{
state[i]=1;
dfs_c(u+1,a,c*10+i);
state[i]=0;
}
}
}
void dfs_a(int u,int a)//u是用了几个数字了,a即a本身
{
if(a>=T)//terminitor是a大于将要计算的数字了
return;
if(a)//如果a是一个符合格式的数字,调用dfs_c函数枚举c
dfs_c(u,a,0);
for(int i=1;i<=9;i++)
{
if(state[i]==0)
{
state[i]=1;
dfs_a(u+1,a*10+i);
state[i]=0;
}
}
}
int main()
{
cin>>T;
dfs_a(0,0);
cout<<res<<endl;
return 0;
}