带分数

来源:互联网 发布:西裤材质 知乎 编辑:程序博客网 时间:2024/05/01 19:48
/*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);}}

原创粉丝点击