/*100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。 题目要求: 从标准输入读入一个正整数N (N<1000*1000) 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法! 例如: 用户输入: 100 程序输出: 11 再例如: 用户输入: 105 程序输出: 6 资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 < 3000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。 注意:主类的名字必须是:Main,否则按无效代码处理。 */ //解法一 /*import java.util.Scanner; public class 带分数 { public static int kinds=0; public static int n=10; public static int a[]=new int[10]; public static boolean vis[]=new boolean[10]; public static int sum(int start,int end) { int sum=0; for(int i=start;i<end;i++) sum=sum*10+a[i+1]; return sum; } static void check(int a[],int num) { int bit=0,temp=num; while(temp!=0) { bit++; temp /= 10; } for(int k=1;k<=bit;k++) { int num1=sum(0,k); if(num1>=num) return; for(int j=k+(n-k)/2;j<n-1;j++) { int num2=sum(k,j); int num3=sum(j,n-1); if(num2>num3 && num2%num3==0 &&num==num1+num2/num3) { System.out.println(num+" = "+num1+"+"+num2+"/"+num3); kinds++; } } } } static void dfs(int start,int end,int num) { if(start==end) { check(a,num); return; } else { for(int i=1;i<n;i++)//全排列 { if(vis[i]) continue; a[start]=i; vis[i]=true; dfs(start+1,n,num); vis[i]=false; } } } public static void main(String[] args) { Scanner cin=new Scanner(System.in); int num=cin.nextInt(); dfs(1,10,num); System.out.println(kinds); } } */ //解法二 /*import java.util.Scanner; public class 带分数 { public static int kinds = 0; public static int n = 10; public static int[] m = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; public static int sum(int start, int end) { int sum = 0; for (int i = start; i < end; i++) sum = sum * 10 + m[i + 1]; return sum; } static void check(int a[], int num) { int bit = 0, temp = num; while (temp != 0) { bit++; temp /= 10; } for (int k = 1; k <= bit; k++) { int num1 = sum(0, k); if (num1 >= num) return; for (int j = k + (n - k) / 2; j < n - 1; j++) { int num2 = sum(k, j); int num3 = sum(j, n - 1); if (num2 > num3 && num2 % num3 == 0 && num == num1 + num2 / num3) { System.out.println(num + " = " + num1 + "+" + num2 + "/" + num3); kinds++; } } } } static void dfs(int start, int end, int num) { if (start == end) { check(m, num); return; } else { for (int i = start; i < end; i++) { int t = m[start]; // 交换元素 m[start] = m[i]; m[i] = t; // 递归全排列 dfs(start + 1, end, num); t = m[start]; // 还原元素 m[start] = m[i]; m[i] = t; } } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int num = cin.nextInt(); dfs(1, 10, num); System.out.println(kinds); } }*/ //解法三 import java.util.Scanner; import java.util.*; public class 带分数 { public static int kinds = 0; public static int n = 10; public static int sum(int start, int end,List<Integer> lis) { int sum = 0; for (int i = start; i < end; i++) sum = sum * 10 +lis.get(i+1); return sum; } static void check(int num,List<Integer> lis) { int bit = 0, temp = num; while (temp != 0) { bit++; temp /= 10; } for (int k = 1; k <= bit; k++) { int num1 = sum(0, k,lis); if (num1 >= num) return; for (int j = k + (n - k) / 2; j < n - 1; j++) { int num2 = sum(k, j,lis); int num3 = sum(j, n-1 ,lis); if (num2 > num3 && num2 % num3 == 0 && num == num1 + num2 / num3) { System.out.println(num + " = " + num1 + "+" + num2 + "/" + num3); kinds++; } } } } static void dfs(List<Integer> lis,int start, int end, int num) { if (start == end) { check(num, lis); return; } else { for (int i = 1; i <= 9; i++) { if (!lis.contains(i)) { lis.set(start, i); } else { continue; } dfs(lis, start + 1, end,num); lis.set(start, 0); } } } public static void main(String[] args) { List<Integer> lis = new ArrayList<Integer>(); for (int i = 0; i < 10; i++) { lis.add(0); // 初始化为全0 } Scanner cin = new Scanner(System.in); int num = cin.nextInt(); dfs(lis,1, 10, num); System.out.println(kinds); } }
作者:u010736393 发表于2013-6-2 20:51:10 原文链接
阅读:31 评论:0 查看评论