蓝桥杯历年试题【带分数】

  • 一开始就觉得脑子很乱,其实自己很怕深搜,或者说很怕暴力的题目,尤其是还要处理不知道位数的数的加减乘除,其中不知道用char[] , String , int[]哪个存储在运算时会更简便一点。
  1. 思路:先用深搜的全排列把满足1~9只出现一次的条件限定出来,这样最棘手的问题就是怎样判断三个数的处理结果等于n,其中,对于我来说最难的是三个数用什么表示,怎样把三个数截取确定出来,而无遗漏
import java.util.Scanner;
public class Main {
	static int []output=new int[10];//String char[] int[] 的选择
	static int []mark=new int[10];
	static int n,count=0;
	public static void main(String []args){
		Scanner in=new Scanner(System.in);
		n=in.nextInt();
		for(int i=0;i<10;i++){
			mark[i]=0;
			output[i]=0;
		}
		dfs(1);
		System.out.println(count);
	}
	public static void dfs(int t){
		if(t==10){
			if(check()){
				count++;
			}
		}
		for(int i=1;i<10;i++){
			if(mark[i]==0){
				mark[i]=1;
				output[t]=i;
				dfs(t+1);
				mark[i]=0;
			}
		}
	}
	public static boolean check(){//检查三个部分是否满足题意
		for(int i=2;i<output.length;i++){//i,j的起止位置如何判定
			for(int j=i+1;j<output.length;j++){
				int integer=getnum(1,i);
				int son=getnum(i,j);
				int mother=getnum(j,output.length);
				if(son%mother!=0)
					continue;
				if(integer+son/mother==n){
					return true;
				}
			}
		}
		return false;
	}
	public static int getnum(int s,int e){
		int res=0;
		int up=1;
		for(int i=e-1;i>=s;i--){
			res+=output[i]*up;
			up*=10;
		}
		return res;
	}
}
  1. 思路:先满足三个数处理结果等于n,难点在于怎么表示这三个数,再判断是否1~9只出现一次
import java.util.Scanner;
public class Main {
	static int []output=new int[10];
	public static void main(String []args){
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		char []judge={'1','2','3','4','5','6','7','8','9'};//String和char[]的选择
		int count=0;
		char c='/';
		for(int integer=1;integer<n;integer++){//怎么知道以什么为枚举的条件
			for(int mother=2;mother<10000;mother++){//分母的截至条件即最大边界是怎么找到的?
				int son=(n-integer)*mother;
				String t=""+integer+mother+son;
				if(t.length()==9){//整数数组和字符串数字数组的选择
					boolean flag=false;
					for(int i=0;i<judge.length;i++){
						if(t.indexOf(judge[i])==-1){
							flag=false;
							break;
						}
						flag=true;
					}
					if(flag){
						System.out.println(integer+"+"+son+c+mother);
						count++;
					}
				}
			}
		}
		System.out.println(count);
	}
}
  • 这方法运行超时了,并且分母的最大边界也不能确定

猜你喜欢

转载自blog.csdn.net/weatarse/article/details/81204526