蓝桥杯-历届试题 带分数

传送门
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式
从标准输入读入一个正整数N (N<1000*1000)

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

注意:不要求输出每个表示,只统计有多少表示法!

样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6

利用STL中的next_permuta()函数可以得到1-9的所有全排列, 当然也可以用dfs来得到全排列,
得到全排列后把九个数字分成三份分别为a, b, c由题意可得限制条件为
1.a < n
2, c != 0
3, b > c && b % c == 0 && b / c == n - a

代码如下`

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
int num[10];
int sum;

int getsum(int a, int b) 			//求得num[a] - num[b]所组成的整数
{
	int re = 0;
	for(int i = a; i<= b; i++)
		re = re * 10 + num[i];
	return re;
}

void solve(int n)
{
	for(int i = 1; i < 10; i++)
	{
		int a = getsum(1, i);
		if(a >= n) return ;
		for(int j = i + (9 - i)/2; j < 10; j++)
		{
			int b = getsum(i + 1, j);
			int c = getsum(j + 1, 9);
			if(b > c  && c && b % c == 0 && b / c == n - a) 
				sum++;
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	for(int i = 1; i < 10; i++)
		num[i] = i;

	do
	{
		solve(n);
	}while(next_permutation(num + 1, num + 10));

	printf("%d\n", sum);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40212930/article/details/88111705