package com.raylew.algorithm.lanqiaocup; /* 标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。 题目要求: 从标准输入读入一个正整数N (N<1000*1000) 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法! 例如: 用户输入: 100 程序输出: 11 再例如: 用户输入: 105 程序输出: 6 */ public class LanQiao13_9 { static int num_times[] = new int[10]; public static void main(String[] args) { int n = 95000; int total = 0; int num_i[] = new int[10]; for (int i = 1; i <= n - 1; i++) { for (int t = 0; t < 10; t++) { num_times[t] = 0; } if (dup(i)) { continue; } int len_k = (9 - (i + "").length()) / 2; int max_k = 1; for (int t = 1; t <= len_k; t++) { max_k = max_k * 10; } for (int t = 0; t < 10; t++) // ��ʱ����i���õ������ָ��� num_i[t] = num_times[t]; for (int k = 1; k < max_k; k++) { for (int t = 0; t < 10; t++) // �ָ�i���õ������ָ��� num_times[t] = num_i[t]; if (dup(k)) { continue; } int j = (n - i) * k; if (j < k) { continue; } if (dup(j)) { continue; } if (checkAll()) { total++; System.out.println(n + "=" + i + "+" + j + "/" + k); } } } System.out.println(total); } // �ж�ÿ�����Ƿ�����ظ������� public static boolean dup(int num) { while (num > 0) { int t = num % 10; num_times[t]++; if (num_times[t] > 1) { return true; } num = num / 10; } if (num_times[0] > 0) { return true; } return false; } public static boolean checkAll() { for (int t = 1; t < 10; t++) { if (num_times[t] == 0) { return false; } } return true; } }