Java复习笔记6【求四位吸血鬼数字】

package com.lesson8.test;
/*
 * 【题目】吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字的位数是原数字的一半位数,
 * 并且由组成原数字的各个位数组成,以两个0结尾的数字不是吸血鬼数字。
 * 例如:1260 = 21 * 60    1827 = 21 * 87    2187= 27 * 81 ,
 * 求所有四位吸血鬼数字
 * */
/*
 * 【解题思路】当前的解题思路很简单暴力,主要是利用枚举法,排序也是自定义的函数,并不复杂
 * 1.利用枚举法:由于将所有四位数枚举一遍不能够得到由两个两位数相乘的四位数,因此需要枚举两位数,
 *  得到可能为吸血鬼数字的四位数
 *  即 x * y = z, x和 y是两位数,z是四位数
 * 2.判断是否为吸血鬼数字:这对数字由组成原数字的各个位数组成,则只要所有位数相同就是吸血鬼数字
 *  即 x * y = z,组成x和y的4个数和组成z的4个数相同
 * 3.如何判断所有位数相同:将所有位数按序排列,最后得到两个内部有序的数字进行比较
 * x * y = z,x和y的4个数排序后得到数字m,z内部位数排序后得到数字n,如果m == n,
 *  表示x和y的4个数和z的4个数相同,否则表示存在不同的位数,则不是吸血鬼数  
 * */

//以1260 = 21 * 60 为例
//1260-----排序后为6210
//21 * 60------排序后为6210

public class Test {
 /*
  * 该方法用于枚举两位数,并判断是否为吸血鬼数字
  * */
 public void getNum(){
  for(int x = 10; x <= 99; x++){
   for(int y = x; y <= 99; y++){ //y=x避免重复
    if(x * y < 1000 || x * y > 10000){
     continue; //如果x*y不是四位数,则不符合条件,继续遍历
    }
    //判断是否为吸血鬼数字
    if(sort(x*100+y) == sort(x*y)){
     System.out.println(x + " * " + y + " = " + x*y);
    }
   }
  }
 }

 /*
  * 该方法用于对给定四位数进行内部排序(递减)
  * @param num int
  * return int 排序后得到的最大数
  * */
 public int sort(int num){
  int n1 = num / 1000;
  int n2 = num % 1000 / 100;
  int n3 = num % 100 / 10;
  int n4 = num % 10;
  //一般三个以上数字的排序都可以转化成三个数字的排序,
  //三个数字的排序则就是求最大、最小、中间值的固定套路
  int max = getMax(n1, getMax(n2, getMax(n3, n4)));
  int last3 = 0;//用来存储除最大数外其余三位数组成的最大数
  if(n1 == max){
   last3 = last3(n2, n3, n4);
  }else if(n2 == max){
   last3 = last3(n1, n3, n4);
  }else if(n3 == max){
   last3 = last3(n1, n2, n4);
  }else{
   last3 = last3(n1, n2, n3);
  }
  return (max * 1000 + last3);
 }

 /*
  * 该方法用于获取最大值
  * */
 public int getMax(int x, int y){
  return x>y?x:y;
 }

 /*
  * 该方法用于获取最小值
  * */
 public int getMin(int x,int y){
  return x>y?y:x;
 }

 /*
  * 该方法用于得到除最大数外其余三位数组成的最大数
  * */
 public int last3(int x,int y,int z){
  int max = getMax(x,getMax(y,z));
  int min = getMin(x,getMin(y,z));
  int mid = x + y + z - max - min;
  return (max*100+mid*10+min);
 }
 
 public static void main(String args[]){
  Test t = new Test();
  t.getNum();
 }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值