Bootstrap

带分数

蓝桥杯历年省赛真题汇总及题目详解

2013年第四届蓝桥杯省赛试题详解

标题:带分数

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

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

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

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

题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!

例如:
用户输入:
100
程序输出:
11

再例如:
用户输入:
105
程序输出:
6

资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<stdio.h>

#define mm 105

int a[10]={0,1,2,3,4,5,6,7,8,9};

int ou[10]={0};
	
int bk[10]={0};

int x,y,z,cnt=0; 

void dfs(int s)
{
	int i;
	
	if(s>9)
	{
			1
		
		x = ou[1];
		
		y = ou[2]*10000+ou[3]*1000+ou[4]*100+ou[5]*10+ou[6];
		
		z = ou[7]*100+ou[8]*10+ou[9];
		
		if(y%z==0)
		{
			if( x+y/z == mm )
			{
				cnt++;
				printf(" %d %d %d \n",x,y,z);
			}
				
		}
		
		///		2
		
		x = ou[1]*10+ou[2];
		
		y = ou[3]*1000+ou[4]*100+ou[5]*10+ou[6];
		
		z = ou[7]*100+ou[8]*10+ou[9];
		
		if(y%z==0)
		{
			if( x+y/z == mm )
			{
				cnt++;
				printf(" %d %d %d \n",x,y,z);
			}
		}
		
	}
	else
	{
		for(i=1;i<10;i++)
		if( bk[i]==0 )
		{
			bk[i]=1;
			
			ou[s]=i;
			dfs(s+1);
			
			bk[i]=0;
		}
	}
	
}

int main()
{
	dfs(1);
	
	printf("%d\n",cnt);
	
	return 0;
}
 
;