蓝桥杯第一课之递归的课后习题。
这是暴力全排,y总讲了别的方法,但目前实力不够,难以理解。 等一个月以后再复盘。
在写这题之前需要先掌握用递归法全排列一组数
中间有几处需要注意的点:
1.开个cal函数计算某几位的十进制数;(这里的计算方法和之前将字符串数组转为某进制数数类似)
2.相当于将一个9位数拆成了三部分a、b、c,注意每一部分最多可取的数位,每位数都至少有1位
3.最后判断是否相等时转成乘法,除法会自动整除
#include<stdio.h>
#define N 10
int target;
int used[N];
int num[N];
int cnt;
int cal(int l,int r)
{
int sum=0;
for(int i=l;i<=r;++i){
sum=sum*10+num[i]; //转十进制数(类似于之前的字符串数组转十进制)
}
return sum;
}
void dfs(int u)
{
if(u>9){//如果已经全排列完成了,即已经排到第10位以上
for(int i=1;i<8;++i){//b和c各至少需要一位
for(int j=i+1;j<9;++j){//c至少要1位
int a=cal(1,i);
int b=cal(i+1,j);
int c=cal(j+1,9);
if(a*c+b==c*target) cnt++;
}
}
return;
}
else{//排第u位的数据
for(int i=1;i<=9;++i){
if(!used[i]){//如果这个数字还没被用过
num[u]=i;//第u位就是这个数
used[i]=1;//表示这个数已经用过了
dfs(u+1);//递归排下一位数
used[i]=0;//恢复现场
}
}
}
}
int main()
{
scanf("%d",&target);
dfs(1);//从第1位开始排列
printf("%d\n",cnt);
}