蓝桥杯--带分数

  历届试题 带分数  
时间限制: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


这道题的解题思路如下:

/*
* 由题目可知解题的公式是: i + (j / k) == n
* 这道题最大难点在于选择 j和k的范围,一般在程序设计题中,使用两个for循环尚且满足条件,一旦使用三个for循环,直接超时
* 由题目可以知道,数字1-9,不重复,这就证明了,我们要求的三个数,加起来的长度是9,长度不等于9直接不满足条件
* 第一个循环,我们先定义i的范围,首先 i肯定大于1,其次,i肯定小于 n - 1,因为 i, j , k 都是整数,所以(n - i)也是整数,
* (n - i) 最小的值是 1,这就说明,i < n - 1,所以 i的值的范围为  1 <= i < n - i;
* 在第二个for循环中,尽可能的缩小范围,由题目可知(n - i) >= 1,(j / k ) == (n - i),所以 (j / k) >= 1;
* k 的范围肯定小于等于 j 的范围,所以,第二个for循环,我们设为k的范围
* 最终获得 j = k * (n - i) ;
* 设L1:数字 i的长度
* 设L2:数字(n - i) 的长度
* L3:数字k的最大范围,Math.pow(10,L3),10的L3次方
* 本题中最大的难度在于确定k的范围,也就是L3的大小,数字j加上数字k 的长度等于 (9 - L1);
* 当(9 - L1)为奇数的时候,L3 = (9 - L1) / 2 + 1;否则L3 = (9 - L1) / 2;
* 那么此时,L3还可以缩小范围,当(n - i) > 1的时候,L3 = L3 - (L2 / 2);
*/


程序代码如下:

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int count = 0;
       for (int i = 1; i < n - 1; i++) {
    	   int L1 = String.valueOf(i).length(); //数字 i的长度
    	   int L2 = String.valueOf(n - i).length(); //数字(n - i) 的长度
    	   int L3 = ((9 - L1) & 1) == 1 ? (9 - L1) / 2 + 1: (9 - L1) / 2; //当(9 - L1)为奇数的时候
    	       L3 = (n - i) > 1 ? L3 - L2 / 2 : L3; //当(n - i) > 1的时候
		   for (int k = 1; k < Math.pow(10, (L3)); k++) {
			   	int j = k * (n - i);
			   	String s = i + "" + j +"" + k; //将i,j,k三个数字拼接成一个字符串
			   	if(s.length() == 9) //当字符串的长度为9时满足条件
			   	{
			   		if(c(s)){
			   			count ++;
			   		}			   		
			   	}
		   }
       }
       
       System.out.println(count);
	}
	
	//定义一个布尔函数,判断字符串是否满足条件
	public static boolean c(String s)
	{
		char[]c = s.toCharArray();
		Arrays.sort(c);
		String s1 = "123456789";
		if(String.valueOf(c).equals(s1))return true;
		return false;
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值