![](https://i-blog.csdnimg.cn/blog_migrate/1eabc85952d58a22a0b516f24fb4557b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ac7d2696b8d22f8f37b4b7824cbd249b.png)
import java.util.Scanner;
public class TestOne {
//用到全排列
static int ans; //得到数字N的可能组合数
private static int N; //要得到的数字N
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();//输入数字
int[] arr = {1,2,3,4,5,6,7,8,9};//对该数组进行全排列
f(arr,0);
System.out.println(ans);
}
/*(1) 确认某一排列的第k位
* */
private static void f(int[] arr, int k) {
//1.全部位置都已确认
if(k==9) {
check(arr);//验证该排列是否通过+、 \组合,得到数字N
return;
}
//2.选定第k位的元素
for(int i=k;i<arr.length;i++) {//第k位可取的元素为 arr数组中 :第k到arr.length个元素
//将第i位作为第k位元素。
int t = arr[i];
arr[i] = arr[k];
arr[k] = t;
//3.移交到下一层,去确认第k+1位
f(arr,k+1);
//4.回溯。换回来,便于后面的位置元素的确认
t=arr[i];
arr[i] = arr[k];
arr[k] = t;
}//for
}
/*(2)枚举 + 和\ 的位置
* */
private static void check(int[] arr) {
//1.由于\在+的后面。所以+前面的数字最多有7位。
for(int i=1;i<=7;i++) {//+前面可能的数字位数
//2.获取+前面的数字,将这些数字转化为整数(0表示的是开始下标,i表示的是数字个数)
int num1 = toInt(arr,0,i);
//3.如果+前面的整数已经超过N,就没必要验算了
if(num1>=N) {
continue;
}
//4.计算+和\之间的数字个数(+和/中间最多有7位。 +前面至少有1位,\后面至少有1位)
for(int j=1;j<=8-i;j++) {
//4.1 将+和\之间的数字转化为整数(i表示开始下标,j表示数字个数)
int num2 = toInt(arr, i, j);
//4.2 获取\后面的数字(共9位数- 加号前的数字个数i - 加号和除号之间的数字位数j)
int num3 = toInt(arr,i+j,9-i-j);
//4.3 判断num1+num2/num3 = N 是否成立
if((num2%num3==0) && (num1+num2/num3==N)) {
ans++;
}
}//for
}//for
}
/*
* (3)将一串数字转化为整数
* arr: 存放一串数字
* pos:开始下标
* len:一串数字的长度
* */
private static int toInt(int[] arr, int pos, int len) {
int t = 1;
int result=0;
for(int i=pos+len-1;i>=pos;i--) {
result+=arr[i]*t;
t=t*10;
}
return result;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/5dafb7efa129b3b19b67f761ad2ee915.png)
![](https://i-blog.csdnimg.cn/blog_migrate/54f71c3058e9b86323d925f3708352f2.png)