day09

一:九数算式

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

观察如下的算式:

9213×85674=789314562

左边的乘数和被乘数正好用到了 11 ~ 99 的所有数字,每个 11 次。 而乘积恰好也是用到了 11 ~ 99 的所有数字,并且每个 11 次。

请你借助计算机的强大计算能力,找出满足如上要求的 99 数算式一共有多少个?

注意:

  1. 总数目包含题目给出的那个示例。

  1. 乘数和被乘数交换后作为同一方案来看待。

运行限制

  • 最大运行时间: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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值