- 一开始就觉得脑子很乱,其实自己很怕深搜,或者说很怕暴力的题目,尤其是还要处理不知道位数的数的加减乘除,其中不知道用char[] , String , int[]哪个存储在运算时会更简便一点。
- 思路:先用深搜的全排列把满足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;
}
}
- 思路:先满足三个数处理结果等于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);
}
}