王玉辰


私信TA

用户名:1652885487

访问量:9570

签 名:

DFS还是香啊

等  级
排  名 224
经  验 6283
参赛次数 18
文章发表 26
年  龄 0
在职情况 学生
学  校 新东方挖掘机汽修学院
专  业 计算机应用

  自我简介:

解题思路:
先将1-9这9个数全排列,然后去寻找+和/的位置,因为需要给后面的除法留位置,所以加号前的数最长也只能是7位数,而且因为后面的除法运算不能为0,所以除数最长只能在倒数第二个数就停止截取。然后就是去判断除数是否能整除(很重要),还有就是这个算式能不能得出等于n的结果,能就加一。
注意事项:
边界!!!边界!!!这题最要注意的就是边界,最难的和最重要的就是全排列和循环找+和/的位置。
参考代码:

import java.util.Scanner;


public class zz带分数 {

	/**
	 * @param args
	 */
	static int []arr={1,2,3,4,5,6,7,8,9};
	static int n;
	static int count=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		n=scanner.nextInt();
		qpl(0);
		System.out.println(count);

	}
	
	//全排列
	public static void qpl(int n) {
		if (n==9) {
			scc(arr);
		}
		for (int i = n; i < 9; i++) {
			int zjs=arr[i];
			arr[i]=arr[n];
			arr[n]=zjs;
			
			qpl(n+1);
			
			//回溯(换回去)
			zjs=arr[i];
			arr[i]=arr[n];
			arr[n]=zjs;
		}
	}
	
	public static void scc(int []arr) {
		for (int i = 1; i <= 7; i++) {
	            int jhq=jq(0, i);//加号前的数
	            if (jhq>=n) {
	                continue;
	            }
			// /号前的数
			//这里的边界也很需要注意,因为我下面写的方法是根据长度来截取,所以这里的9-i其实
			//是表示能被截取的长度而不是下标,这里要很注意(我都被绕进去了,把他当做下标导致
			//被除数最少也是两位数,找了半天才想起来,这里是长度,不是下标,才把9改成9-i)
			for (int j = 1; j < 9-i; j++) {
				int num1=jq(i, j);
				int num2=jq(i+j, 9-i-j);
				if (num1%num2==0&&jhq+num1/num2==n) {
					count++;
				}
			}
		}
	}
	
	//将截取的数从数组中取出来算成数(我这里写的方法是根据起点下标和截取长度来截取的,这里要注意一下)
	public static int jq(int qd,int cd) {
		int nn=1;
		int num=0;
		for (int i =qd+cd-1; i >=qd; i--) {
			num+=arr[i]*nn;
			nn*=10;
		}
		return num;
	}

}


 

0.0分

2 人评分

  评论区

666
2020-10-11 14:52:51
  • «
  • 1
  • »