蓝桥杯历届试题 带分数

试题 历届试题 带分数

资源限制
时间限制: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

思路:
先全排列,
式子格式定义为 num=a+b/c
a ,b , c有如下关系:

  1. num>a
  2. b>c 且 b%c=0 分子比分母大,且得数必须为整数

b的范围能进一步优化,b的位数有这样的关系 :
设a的位数为n,则(9-n)/2<=b的位数<=8-n ,8-n是因为得给c留一位

两个循环控制a 、b的位数(c的位数也因此定下来了),然后遍历计算a、b、c值。

import java.util.Scanner;


public class 带分数 {
	
	static int[] s=new int[10];
	static boolean[] vis=new boolean[10];
	final static int N=9;
	static int num=0;
	static int ans=0;
//	static int n=9;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		num=sc.nextInt();
		dfs(1);
		System.out.print(ans);
	}

	static void dfs(int cur){
		if(cur==N+1)
			compute();
//			print();
		else
			for(int i=1;i<=N;i++){
				if(!vis[i]){
					s[cur]=i;
					vis[i]=true;
					dfs(cur+1);
					vis[i]=false;
				}
			}	
	}
	

	static void print(){
		for(int i=1;i<=9;i++)
			System.out.print(s[i]+" ");
		System.out.println();
	}
	static void compute(){
		int a=0,b=0,c=0;
		for(int i=1;i<=9;i++){
			a=0;
			for(int j=1;j<=i;j++){
				a=s[j]+a*10;
			}
			if(a<num){          // b c
				for(int k=(9-i)/2+i;k<=8;k++){
					b=0;
					c=0;
					for(int h=i+1;h<=k;h++)
						b=b*10+s[h];
					for(int h=k+1;h<=9;h++)
						c=c*10+s[h];
					if( b%c==0 && num==a+b/c )
						ans++;
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值