蓝桥杯—带分数

在这里插入图片描述
暴力思路:
首先我们观察样例
100 = 3 + 69258/714
转化为n = a + b/c
n是题目中给出的数据,我们就只需要对a,b,c进行枚举即可
我们通过递归列举出1~9的全排列
然后从第一个排列开始,将其划分为三段,分别对应三个数
比如说123456789
现在取a = 1;b = 5;c = 3
那么a = 1
b = 23456
c = 789
这样分别对a,b,c取不同的位数,我们就可以列举出123456789中a,b,c的所有取数情况
然后分别代入式子n = a + b/c判断等式是否成立即可
这个地方需要注意一下,将其转化为乘法的形式,因为整型数据是直接舍弃小数点的
即判断cn == ac+b是否成立,成立则说明成功找到一个
然后从头到尾依次对所有的全排列进行如上的操作
最终就能很暴力的得出答案
当然我们在其中可以通过一些a,b,c之间的关系进行时间的优化
然后全排列使用递归来输出比用STL中的permutation来得更快,这里就采用递归了

#include<iostream>
#include<cstdio>
#include<cstring>

int n,cnt,a,b,c;
const int N = 10;
int st[N];
int re[N];
using namespace std;

void dfs(int u)
{
	if(u > 9){//边界
		for(int a_ = 1;a_ < n;a_++){
			a = a*10 + re[a_];
			if(a > n)
				break;
			for(int b_ = (9-a_)/2;b_ <= 9-a_-1;b_++){
				for(int i = a_+1;i <= a_+b_;i++)
					b = b*10 + re[i];
				for(int i = a_+b_+1;i <= 9;i++)
					c = c*10 + re[i];
				if(n*c == a*c+b)	cnt++;
				b = 0;
				c = 0;
			}
		}
		a = 0;
		return;
	}
	
	for(int i = 1;i <= 9;i++){
		if(!st[i]){
			st[i] = 1;
			re[u] = i;
			dfs(u+1);
			st[i] = 0;
		}
	}
}
int main()
{
	cin >> n;
	dfs(1);
	cout << cnt;
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值