蓝桥杯 历届试题 带分数

该博客主要介绍了蓝桥杯竞赛中涉及到的一种特殊分数搜索问题的解决方法。通过编写C++代码,实现对整数部分和分数部分的有效搜索,其中整数部分不允许出现0,分母小于分子且长度小于等于分子的一半。利用深度优先搜索策略(DFS)进行求解,对每个可能的分子值进行检查,并确保分母满足条件。
1.对整数部分从1~n-1进行搜索,用flag记录已经出现过的数字(!式子中不能出现0,出现给flag标记中的0赋值为1);
2.分数部分,分母一定小于分子,分母长度一定小于等于分子,即分子长度一定小于等于右边总长度的一半
#include <iostream>
#include <cstring> 
using namespace std;
#define MAX 10

bool flag[MAX],copyf[MAX];  
int n,sum,r,len;  
  
bool check(int n) 
{
	int m; 
	while(n){
		m=n%10; 
		if (flag[m]) return false;  
		flag[m]=true;  
		n/=10;  
		len++; 
	}
	return true; 
} 

bool Ans(int num,int molecule)
{
	for (int i=1;i<MAX;i++){
		copyf[i]=flag[i]; 
	} 
	int s=0,m; 
	while (molecule) 
	{
		m=molecule%10; 
		if (copyf[m]) return false; 
		copyf[m]=true;  
		s++; 
		molecule/=10;     
	} 
	 
	if (len-num==s){
		return true;
	}
	return false; 
}
  
void dfs(int num,int denominator)
{
	if (num<=len/2)
	{ 
		if (Ans(num,denominator*r)) 
		{  
			sum++; 
		}

		for (int i=1;i<MAX;i++)
		{ 
			if (!flag[i])
			{
				flag[i]=true; 
				dfs(num+1,denominator*10+i);  
				flag[i]=false; 
			}
		}
	}
} 

int main()
{
	while(cin>>n)
	{ 
		sum=0; 
		for (int i=1;i<n;i++)
		{ 
			len=0; 
			memset(flag,0,sizeof(flag));  
			flag[0]=1; 
			if (check(i))
			{   
				r=n-i;   
				len=9-len;  
				dfs(0,0);   
			}
		}
		cout<<sum<<endl; 
	}
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值