蓝桥杯:带分数

带分数【全排列】

题目描述:

100 可以表示为带分数的形式:100 = 3 + 69258 / 714还可以表示为:100 = 82 + 3546 / 197

注意特征:带分数中,数字 1~9 分别出现且只出现一次(不包含 0 )。类似这样的带分数,100 有 11 种表示法。

输入描述:

从标准输入读入一个正整数 N (N<1000×1000)。

输出描述:

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

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

输入样例:

100

输出样例:

11

思路:

这道题的思路就是将数字1~9的全排列全部列出来,然后划分出来a,b,c三个数,判断是否满足n = a + b / c。如果满足则是一种表示。统计一共多少表示。

全排列要用到一种函数:next_permutation(数组头地址,数组尾地址) ,该函数将按字母表顺序生成给定序列的下一个较大的排列。若下一个排列存在,则返回ture,如果不存在则返回假。

代码:

#include
using namespace std;
int num[]={1,2,3,4,5,6,7,8,9};

int check(int l,int r)
{   //转化成数 
	int sum=0;
	for(int i=l;i<=r;i++)
		sum=sum*10+num[i];
	return sum;
}

int main()
{
	int n,count=0;
	int a,b,c;
	scanf("%d",&n);
	while(next_permutation(num,num+9))
	{   //如果全排列存在 
		for(int i=0;i<=6;i++)
		{
			for(int k=i+1;k<=8;k++)
			{   //划分区间 
				a=check(0,i);
				b=check(i+1,k);
				c=check(k+1,8);
				if(n*c==a*c+b)   //如果满足,计算加一 
					count++;
			}
		}
	}
	printf("%d",count);
	return 0;
}

你可能感兴趣的:(蓝桥杯,蓝桥杯复习题,c++,算法,蓝桥杯)