最近都忙着炒股,好久没写博客了,蓝桥杯决赛在即,今天必须来一发了
测评链接: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);
}
}