历届试题 带分数(搜索)

来源:互联网 发布:我的世界 java版本 编辑:程序博客网 时间:2024/06/05 07:02
历届试题 带分数  
时间限制:1.0s   内存限制:256.0MB
      
锦囊1
枚举或搜索。
锦囊2
枚举带分数的第一项和后一项的分母,即可算出分子。在枚举的时候如果前一个数中已经包含了重复的数字则可以跳过。
问题描述

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.Scanner;public class Main {/** * @param args */static int[] arr;static int kind;static int[] a = new int[10];static boolean[] vis = new boolean[10];static int n = 10;static int N;public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);while (sc.hasNext()) {N = sc.nextInt();kind = 0;dfs(1);System.out.println(kind);}}private static void dfs(int start) {// TODO Auto-generated method stubif (start == n) {check();} else {for (int i = 1; i < n; i++) {if (vis[i] == false) {a[start] = i;vis[i] = true;dfs(start + 1);vis[i] = false;}}}}private static void check() {// TODO Auto-generated method stubint len = String.valueOf(N).length();for (int i = 1; i <= len; i++) {int num = F(1, i);if (num > N)break;for (int j = i + (n - i) / 2; j < n-1; j++) {int num2 = F(i + 1, j);int num3 = F(j + 1, n - 1);if (num2 > num3 && num2 % num3 == 0 && N == num + num2 / num3)kind++;}}}private static int F(int start, int end) {// TODO Auto-generated method stubint sum = 0;for (int i = start; i <= end; i++)sum = sum * 10 + a[i];return sum;}}


0 0
原创粉丝点击