100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。注意:不要求输出每个表示,只统计有多少表示法! 例如:用户输入:100程序输出:11再例如:
用户输入:105程序输出:6 资源约定:峰值内存消耗(含虚拟机) < 64MCPU消耗 < 3000ms
这一题主要是熟悉全排列和数字的组合。
1 import java.util.Scanner; 2 3 public class A { 4 5 static int vis[] = new int[1000 * 1001]; 6 static int a, b, c, ans; 7 8 public static void main(String[] args) { 9 int[] num = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9 };10 Scanner scanner = new Scanner(System.in);11 int n = scanner.nextInt();12 per(num, 0);13 System.out.println(vis[n]);14 }15 16 public static void per(int[] num, int start) {17 if (start == num.length) {18 ser(num);19 return;20 }21 for (int i = start; i < num.length; i++) {22 swap(num, start, i);23 per(num, start + 1);24 swap(num, start, i);25 }26 }27 28 public static void swap(int[] num, int n, int m) {29 int t = num[n];30 num[n] = num[m];31 num[m] = t;32 }33 34 public static void ser(int[] num) {35 for (int i = 0; i <= 6; i++) {36 for (int j = i + 1; j <= 7; j++) {37 a = 0;38 b = 0;39 c = 0;40 ans = 0;41 for (int k = 0; k <= i; k++) {42 a = a * 10 + num[k];43 }44 for (int k = i + 1; k <= j; k++) {45 b = b * 10 + num[k];46 }47 for (int k = j + 1; k <= 8; k++) {48 c = c * 10 + num[k];49 }50 if (b % c == 0) {51 ans = a + b / c;52 if (ans < 1000000)53 vis[ans]++;54 }55 }56 }57 }58 59 }