蓝桥杯带分数,这道题可以暴力破解,但是超时是绝对的,所以考虑其他算法,这里提供一种思路是用dfs做的。
//本题思路:1~9九个数字不重复,从这一点切入,先判断整数部分,然后计算出分数部分的位数,利用分母=分子*(原数字-整数)判断分子,算法核心dfs,通过dfs分母实现整个流程
#include<stdio.h>
#include<string.h>
int a[10]={0},b[10],n,v,len,cnt=0;
int fun(int i){ //判断整数位
int ln=0;
while(i){
if(a[i%10])
return 0; //只能return,不然会错误计算ln得值
else{
a[i%10]=1;
i/=10;
ln++;
}
}
len=9-ln; //确定分子分母的位数
return 1;
}
int dofun(int x){ //判断分母
int ln=0;
memcpy(b,a,sizeof(b));
while(x){
if(b[x%10])
return 0;
else{
b[x%10]=1;
ln++;
x/=10;
}
}
return ln; //分母为数
}
void dfs(int ln,int x){ //ln为分母的位数,x为分母的值
int i;
if(ln<=len/2){
if(dofun(v*x)==len-ln) //确定有且仅有九位
cnt++;
for(i=1;i<10;i++){
if(!a[i]){
a[i]=1;
dfs(ln+1,x*10+i); //增加位数
a[i]=0; //dfs返回置零表示未使用
}
}
}
}
int main(void){
int i;
scanf("%d",&n);
for(i=1;i<n;i++){
a[0]=1;
if(fun(i)){
v=n-i;
dfs(0,0);
}
memset(a,0,sizeof(a));
}
printf("%d\n",cnt);
return 0;
}