解题思路:
注意事项:
参考代码:
import java.util.Scanner;
public class Main {
static int ans;
static int 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};
dfs(0, arr);
System.out.println(ans);
}
//全排列
public static void dfs(int i,int[] arr) {
if(i == arr.length - 1) {//找到一种排列时
check(arr);//检查放入加号和乘号能否符合要求
return;
}
for (int k = i; k < arr.length; k++) {//对于每一个i位置以后的元素都可放到这个i位置构成一种可能的排列顺序
swap(arr, i, k);
dfs(i + 1, arr);
swap(arr, i, k);//回溯
}
}
public static void check(int[] arr) {
//加号前面的字符数最多有七个
for (int i = 1; i <= 7; i++) {//最少1个最多七个
int num1 = toInt(arr, 0, i);//加号前面的数字
if (num1 >= N) {
continue;
}
//除法前面的数字
for (int j = 1; j < 9 - i; j++) {//最少1个最多7个
int num2 = toInt(arr, i, i + j);
int num3 = toInt(arr, i + j, 9);
if(num2 % num3 == 0 && num1 + num2 / num3 == N) {//需要保证 num2和num3一定是逻辑整除关系
ans++;
}
}
}
}
//转换数字 从最后一位开始遍历
public static int toInt(int[] arr,int start,int end) {
int res = 0;
int mul = 1;//乘数因子
for (int i = end - 1; i >= start; i--) {
res += arr[i] * mul;
mul *= 10;
}
return res;
}
//交换位置代码
public static void swap(int[] arr,int i,int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:610 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:1555 |
求圆的面积 (C语言代码)浏览:1366 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1327 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:1314 |
2004年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:1368 |
用筛法求之N内的素数。 (C++代码)浏览:754 |
C语言训练-亲密数 (C语言代码)浏览:697 |
sizeof的大作用 (C语言代码)浏览:1138 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:712 |