蓝桥杯之带分数

来源:互联网 发布:海牛大数据 编辑:程序博客网 时间:2024/06/03 05:31

 

标题:带分数

    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


思路:dfs列出1至9的全排列,然后将‘+’与‘/’插入到每个全排列中,判断等式

N == a+b/c && b%c == 0;

为真则count++;

全局变量:

<span style="font-size:18px;">public static boolean[]  arr = new boolean[10];public static int[]      numA = new int[9];public static int        count = 0;</span> 

dfs全排列代码如下:

<span style="font-size:18px;">public static void dfs(int p,int num){if(p == 9){pd(numA,num);//判断函数return;</span>
<span style="font-size:18px;">}else{for(int i = 1;i<10;i++){if(arr[i]){numA[p] = i;arr[i] = false;dfs(p+1,num);arr[i] = true;}}}}</span>

将数组转化成String,更容易插入。
插入运算符规则:a的位数<=N的位数,b的位数>=c的位数。

判断代码如下:

<span style="font-size:18px;">public static void pd(int[] arr,int num){int a,b,c;int leng = String.valueOf(num).length();String str = "";for(int i = 0;i<arr.length;i++)str+=arr[i];for(int i = 1;i<= leng;i++){a = Integer.valueOf(str.substring(0,i));for(int j = (9-i)/2+i;j<9;j++){b = Integer.valueOf(str.substring(i,j));c = Integer.valueOf(str.substring(j,str.length()));if((num == a+b/c)&&(b%c == 0)){count++;}} }}</span>


完整代码:

<span style="font-size:18px;">import java.util.*;class Main{public static boolean[]  arr = new boolean[10];public static int[] numA = new int[9];public static int count = 0;public static void main(String[] arge){Scanner cin = new Scanner(System.in);int num = cin.nextInt();Arrays.fill(arr,true);long start = System.currentTimeMillis();dfs(0,num);start = System.currentTimeMillis() - start;System.out.println(start);System.out.println(count);}public static void dfs(int p,int num){if(p == 9){pd(numA,num);return;}else{for(int i = 1;i<10;i++){if(arr[i]){numA[p] = i;arr[i] = false;dfs(p+1,num);arr[i] = true;}}}}public static void pd(int[] arr,int num){int a,b,c;int leng = String.valueOf(num).length();String str = "";for(int i = 0;i<arr.length;i++)str+=arr[i];for(int i = 1;i<= leng;i++){a = Integer.valueOf(str.substring(0,i));for(int j = (9-i)/2+i;j<9;j++){b = Integer.valueOf(str.substring(i,j));c = Integer.valueOf(str.substring(j,str.length()));if((num == a+b/c)&&(b%c == 0)){count++;}} }}}</span>


 转载请附带原址:http://blog.csdn.net/u013451048

0 0
原创粉丝点击