现在的位置: 首页 > 综合 > 正文

2013蓝桥杯本科B组第9题《带分数》

2018年04月05日 ⁄ 综合 ⁄ 共 1046字 ⁄ 字号 评论关闭

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int Max = 9;

int ca,s,cnt,ri;
int flag[Max + 1];
int bak[Max + 1];

int check(int l){                     //标记已有的位,检查数字是否符合规则
	int length = 0;
	while(l){
		if(flag[l%10])return 0;
		flag[l%10] = 1;
		l /= 10;
		length ++;
	}
	s = Max - length;
	return 1;
}

int checks(int n){
	int length = 0;
	memcpy(bak,flag,sizeof(bak));
	while(n){
		if(bak[n%10])return 0;
		bak[n%10] = 1;
		n /= 10;
		length ++;
	}
	return length;
}


void dfs(int depth,int v){                     //通过剩余数字构造分子,并且验证分母
	if(depth <= s / 2){
		if(checks(v * ri) == s - depth)cnt ++;
		for(int i = 1 ; i <= Max ; i ++){
			if(flag[i])continue;
			flag[i] = 1;
			dfs(depth + 1,v * 10 + i);
			flag[i] = 0;
		}
	}
}

int main(void){
	while(scanf("%d",&ca) == 1){
		cnt = 0;
		for(int left = 1 ; left < ca ; left ++){
			flag[0] = 1;
			if(check(left)){
				ri = ca - left;
				dfs(0,0);
			}
			memset(flag,0,sizeof(flag));
		}
		printf("%d\n",cnt);
	}
	return 0;
}

标题:带分数

    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

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.