一:九数算式
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
观察如下的算式:
9213×85674=789314562
左边的乘数和被乘数正好用到了 11 ~ 99 的所有数字,每个 11 次。 而乘积恰好也是用到了 11 ~ 99 的所有数字,并且每个 11 次。
请你借助计算机的强大计算能力,找出满足如上要求的 99 数算式一共有多少个?
注意:
总数目包含题目给出的那个示例。
乘数和被乘数交换后作为同一方案来看待。
运行限制
最大运行时间:1s
最大运行内存: 128M
解题思路:
先规定一个从1到9长度为9的数组。
把1到9进行全排列
把乘号进行全排列
import java.util.Set;
import java.util.HashSet;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int[]a={1,2,3,4,5,6,7,8,9};
static int count;
public static void main(String[] args) {
per(0);
//两个乘数互换位置属于一种情况,所以结果除2
int ans=count/2;
System.out.println(ans);
}
public static void per(int k){
if(k==9){
for(int i=1;i<=8;i++){
int x1=algor(0,i);
int x2=algor(i,9);
if(check(x1*x2))
count++;
}
}
//全排类(递归版本)
for(int i=k;i<9;i++){
int t=a[i];
a[i]=a[k];
a[k]=t;
per(k+1);
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
//判断最终结果是否包含1-9的九位数
public static boolean check(int x) {
String s=x+"";
if(s.length()!=9 || s.indexOf('0')>-1) return false;
HashSet<Character> set =new HashSet<Character>();//api
for(int i=0;i<s.length();i++) {//遍历字符串s
set.add(s.charAt(i));//添加字符串s的字母
}
return set.size()==9;//判断set长度是否为10,是则返回true。不是返回false
}
//将零散的整数 组成乘数
public static int algor(int i, int j) {
int x=0;
int p=1;
for(int k=j-1;k>=i;k--){
x+=a[k]*p;
p*=10;
}
return x;
}
}
二:山
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
这天小明正在学数数。
他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321 、 145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。
小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022, 2022222022][2022,2022222022] 中有 多少个数的形状像一座 “山”。
运行限制
最大运行时间:1s
最大运行内存: 512M
暴力解法:由题中可知结果均为回文数(数字对称),可分类讨论,从4位开始(最大位为2-9,因为最小值为2022,只需考虑前两位数),5,6位(两者情况相同,只需考虑前三位数),7,8位(两者情况相同,只需考虑前四位数), 9位和10位(最大位只能为1,因为最大值为2022222022)(9位和10位数两者情况也相同,只需考虑前五位数,但10位的最大位由于范围原因只能取1)
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
int sum=0;
int a1=0;
int a2=0;
int a3=0;
int a4=0;
//四位
for(int i=2;i<=9;i++){
for(int j=i;j<=9;j++){
a1++;
}
}
//五位和六位数量相等
for(int i=1;i<=9;i++){
for(int j=i;j<=9;j++){
for(int k=j;k<=9;k++){
a2++;
}
}
}
a2=a2*2;
//七位和八位数量相等
for(int i=1;i<=9;i++){
for (int j=i;j<=9;j++){
for(int k=j;k<=9;k++){
for(int l=k;l<=9;l++){
a3++;
}
}
}
}
a3=a3*2;
//九位
for(int i=1;i<=9;i++){
for (int j=i;j<=9;j++){
for(int k=j;k<=9;k++){
for(int l=k;l<=9;l++){
for(int m=l;m<=9;m++){
a4++;
}
}
}
}
}
//十位(最大位限制在1,因此与九位的情况不相同)
for(int i=1;i<2;i++){
for (int j=i;j<=9;j++){
for(int k=j;k<=9;k++){
for(int l=k;l<=9;l++){
for(int m=l;m<=9;m++){
a4++;
}
}
}
}
}
sum=a1+a2+a3+a4;
System.out.println(sum);
}
}