1、9数算式
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
观察如下的算式:
9213×85674=789314562
左边的乘数和被乘数正好用到了 1 ~ 9的所有数字,每个1次。 而乘积恰好也是用到了 1 ~ 9 的所有数字,并且每个 1 次。
请你借助计算机的强大计算能力,找出满足如上要求的 9 数算式一共有多少个?
注意:
- 总数目包含题目给出的那个示例。
- 乘数和被乘数交换后作为同一方案来看待。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
核心思路:
使用深度优先搜索dfs将1-9的数字进行全排列,然后将所生成的所有组合存进数组nums,结合循环利用substring函数将每种组合可能出现的被乘数与乘数算出被进行相乘,得到的乘积通过判断是否重复,是否包含0,是否不是九位数,如果满足所有条件,即乘积是九位数同时不包含0同时里边由1-9组成,则返回true,让计数器count加一,最后输出时要注意,因为被乘数和乘数会出现重复情况,所以要/2。
注:代码没错,会超时,不过此题是填空题,能做出结果即可,答案1625。
import java.util.*;
public class Main7 {
public static int n = 9;
public static int q = 0;
public static int N = 400000;
public static int []path = new int[N];
public static String[]nums = new String[N];
public static int count = 0;
public static boolean[]st = new boolean[N];
public static int p = 0;
public static int rr = 0;
public static void main(String[] args) {
dfs(1);//从1开始排列
for(int i = 0;i<q;i++){
for(int j=0;j<8;j++){//补充:在这里我原本写的j<9,导致Integer.parseInt报错,因为里边不能包含""这种特殊字符
String str1 = nums[i].substring(0,j+1);
String str2 = nums[i].substring(j+1,9);
//product=Integer.valueOf(str1)*Integer.valueOf(str2);
int product1 = Integer.parseInt(str1);
int product2 = Integer.parseInt(str2);//
//StringBuilder product=new StringBuilder(String.valueOf(Integer.parseInt(str1)*Integer.parseInt(str2)));
if(isUnique(product1,product2)){
count++;
}
}
}
System.out.println(count/2);//由于被乘数和乘数会重复,所以/2
}
public static void dfs(int u){
if(u==n+1){//保证每个数字都能进入,因为开始dfs(1)
//nums[q]=String.valueOf(path[1]);
nums[q]="";
for(int i = 1;i<=n;i++){
nums[q]+=String.valueOf(path[i]);
}
q++;
return;
}
for(int i = 1;i<=n;i++){//每次进这个for循环后,只有没被标记的才能往下走
if(!st[i]){//st数组是标记功能,没标记的进入
path[u]=i;//遵循深度优先探索进行赋值
st[i] = true;//标记为用过的
dfs(u+1);//进行下一个数字
st[i]=false;//进行回溯,恢复现场,由于path会被接下来的每一种排列所覆盖,所以不需要进行回溯
}
}
}
public static boolean isUnique(int n1,int n2) {//判断是否有重复的,是否包含0,是否不是九位数
int res = n1*n2;
String s = String.valueOf(res);
if(s.contains("0")||s.length()!=9) {
return false;
}
Set<Character>set = new HashSet<>();//利用set集合来进行去重
for(char c:s.toCharArray()) {
set.add(c);
}
return(set.size()==s.length());//判断是否重复
}
}
3、山
这天小明正在学数数。
他突然发现有些止整数的形状像一挫 “山”, 比如 123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。
小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022]中有 多少个数的形状像一座 “山”。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
思路:
依然是填空题,答案3138,利用 StringBuilder的翻转reverse即可判断回文数,又因为是回文数,只需要判断一半是不是单调不减即可。
import java.util.*;
public class Main{
public static void main(String[] args) {
long ans=0;
for(long i=2022;i<=2022222022;i++) {
if(ismt(i)) {
ans++;
}
}
System.out.println(ans);
}
private static boolean ismt(long i) {
//判断是否回文
String string = String.valueOf(i);
StringBuilder s = new StringBuilder(string);
if(string.compareTo(s.reverse().toString())==0) { //使用StringBuilder的reverse,进行翻转判断回文数
for(int j=0;j<string.length()/2;j++) {
int l = Integer.valueOf(string.charAt(j));
int r = Integer.valueOf(string.charAt(j+1));
if(r<l)//只需要判断前半边就行了,因为是回文数
return false;
}
return true;
}
return false;
}
}
剩下两题尽快补上,先认真做俩题打卡啦,作业太多,不好意思。