蓝桥杯 带分数 (JAVA版)

最近都忙着炒股,好久没写博客了,蓝桥杯决赛在即,今天必须来一发了


测评链接:http://lx.lanqiao.org/problem.page?gpid=T26


问题描述:

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
import java.util.LinkedList;
import java.util.Scanner;

public class Main
{
    static int n, count;
    static int arr[] = {1,2,3,4,5,6,7,8,9};
    static boolean flag[] = new boolean[10];
    
    static int dev(int s, int e)
    {
        int ans = 0;
        for(int i = s; i <= e; i++)
        {
            ans += arr[i];
            ans *= 10;
        }
        return ans/10;
    }
    
    static void fun2()
    {
        for(int i = 0; i < 7; ++i)
        {
            int a = dev(0,i);
            if(a >= n)
            {
                continue;
            }
            for(int j = i+1; j < 8; ++j)
            {
                int b = dev(i+1,j);
                int c = dev(j+1,arr.length-1);
                if(a+1.0*b/c==n)
                {
                    count++;
                    //System.out.println(a+" + "+b+" / "+c+" = "+n);
                }
            }
        }
    }
    
    static void fun(int cnt)
    {
        if(cnt == arr.length)
        {
            fun2();
            return;
        }
        for(int i = cnt; i < arr.length; ++i)
        {
            {int t = arr[cnt];arr[cnt] = arr[i];arr[i] = t;}
            fun(cnt+1);
            {int t = arr[cnt];arr[cnt] = arr[i];arr[i] = t;}
        }
        
    }
    
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        fun(0);
        System.out.println(count);
    }
}


你可能感兴趣的:(java)