枚举--带分数

这篇文章介绍了如何编写一个程序,用于计算一个正整数(小于10^6)使用数码1到9不重复不遗漏表示为带分数的所有可能方法的数量。程序通过遍历不同的整数组合来实现,同时检查是否符合1-9仅出现一次且不包含0的条件。
摘要由CSDN通过智能技术生成

# [蓝桥杯 2013 省 B] 带分数

## 题目描述

$100$ 可以表示为带分数的形式:$100 = 3 + \frac{69258}{714}$。

还可以表示为:$100 = 82 + \frac{3546}{197}$。

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

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

## 输入格式

从标准输入读入一个正整数 $N(N<10^6)$。

## 输出格式

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

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

## 样例 #1

### 样例输入 #1

```
100
```

### 样例输出 #1

```
11
```

## 样例 #2

### 样例输入 #2

```
105
```

### 样例输出 #2

```
6
```

## 提示

原题时限 3 秒, 64M。蓝桥杯 2013 年第四届省赛

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    	Scanner scanner = new Scanner(System.in);
    	int n = scanner.nextInt();
    	int count = 0;
    	for(int i = 1;i < n;i++) {
    		for(int j = 1;j < 5000;j++) {//j < ?这里的5000是瞎填的hh
    			if(n == i + ((n - i) * j) / (1 * j)) {
    				//j为倍数,从n - i/1逐渐递增,倍数逐渐变大
    				int a = i,b = (n - i) * j,c = 1 * j;
    				if(judge(a,b,c)) count++;
    			}
    		}
    	}
    	System.out.print(count);
    }
    public static boolean judge(int a,int b,int c) {
    	int[] arr = new int[10];
    	while(a != 0) {
    		arr[a % 10]++;
    		a /= 10;
    	}
    	while(b != 0) {
    		arr[b % 10]++;
    		b /= 10;
    	}
    	while(c != 0) {
    		arr[c % 10]++;
    		c /= 10;
    	}
    	boolean flag = true;
    	for(int i = 1;i < 10;i++) {
    		if(arr[i] != 1) flag = false;//保证1-9不重复不遗漏
    	}
    	if(arr[0] != 0) flag = false;//出现0则不满足                                                                   
    	return flag;
    }
     
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值