1209带分数

蓝桥杯第一课之递归的课后习题。

这是暴力全排,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);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值