蓝桥杯 c语言带分数,蓝桥杯 - 带分数 (DFS)

历届试题 带分数

时间限制:1.0s   内存限制:256.0MB

问题描写叙述

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

思路:简单DFS,先枚举整数部分,然后再DFS枚举分母就可以

AC代码:

#include

#include

#include

#include

#include

using namespace std;

int flag[20], n;

int ans;

int ll;//ll为去掉整数位数而剩下的位数

int v;//v为分数的整数值)

int fun(int x) {

int len = 0;

while(x) {

int t = x % 10;

if(flag[t]) return 0;

flag[t] = 1;

x /= 10;

len++;

}

ll = 9 - len;

return 1;

}

int judge(int x, int l) {

int len = 0;

int a[20];

memcpy(a, flag, sizeof(flag));

while(x) {

int t = x % 10;

if(a[t]) return 0;

a[t] = 1;

x /= 10;

len ++;

}

int ff = 1;

for(int i = 1; i < 10; i++) {//看数字1到9是否都用到了

if(a[i] == 0) ff = 0;

}

if(ff && len == ll - l) return 1;

return 0;

}

void dfs(int len, int x) {//len为此时分母所占的位数。x为分母

if(len <= ll / 2) {

if(judge(v * x, len)) //v*x为分子

ans ++;

for(int i = 1; i < 10; i++) {

if(flag[i]) continue;

flag[i] = 1;

dfs(len + 1, x * 10 + i);

flag[i] = 0;

}

}

}

int main() {

while(cin >> n) {

ans = 0;

for(int i = 1; i < n; i++) {

memset(flag, 0, sizeof(flag));

if(fun(i)) {

v = n - i;

dfs(0, 0);

}

}

cout << ans << endl;

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值