Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

带分数

$
0
0
/*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 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>