带分数--第四届蓝桥杯省赛C++ B组

题目描述
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。

输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。

数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6

AC代码:

/*
1.n = a + b/c;
2.全排列9个数字
3.分段,割成三段,分别对应a, b, c
4.判断 
*/ 
#include <cstdio>
#include <iostream>

using namespace std;

int count = 0;//记录多少中表示方法 
int nums[9];//存储全排列 
int N,a,b,c;
int used[9];//代表这个数字是否使用

int cal(int left, int right)
{
	int num = nums[left];
	while(left < right)
	{
		num = num * 10 + nums[++left];
	}
	return num;
}
void dfs(int index)//枚举到第index位置 
{
	if(index == 9)
	{
		//枚举到第9个位置,说明枚举完成,分割
		//1 2 3 4 5 6 7 8 9
		//分割,i代表第一道分割线,最多包含7,即第六个位置 
		//分割,j代表第二道分割线 ,最多包含8,即第七个位置 
		for(int i = 0; i < 7; i++)
		{
			for(int j = i + 1; j < 8; j++)
			{
				a = cal(0,i);
				b = cal(i+1,j);
				c = cal(j+1,8);
				
				//判断是否满足
				//先判断b能否整除c
				//在判断相加结果
				if(N*c == a*c + b)
					count++;
			}
		}
		return;
	}
	
	for(int i = 1; i <= 9; i++)
	{
		if(!used[i])
		{
			used[i] = 1;
			nums[index] = i;
			dfs(index + 1);
			used[i] = 0;;
		}
	}
}

int main()
{
	scanf("%d", &N);
	dfs(0);
	printf("%d", count);
	return 0;
}
发布了36 篇原创文章 · 获赞 47 · 访问量 3965

猜你喜欢

转载自blog.csdn.net/qq_43800455/article/details/105174339