吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。在java编程思想发现了一道吸血鬼数字算法的题目,自己分别写出了4位和6位的算法,特别地,自己增加了一个n位的吸血鬼算法,来满足我对算法的狂热。功能1:判断这个数字是否为吸血鬼数字
功能2:查找n位范围内的吸血鬼数字解决吸血鬼数字的算法的关键在于对一串数字进行成熟与被乘数的拆分以及对拆分后的数字进行全排列。例如一串数字12345678   可拆分为
被乘数                 乘数
1234                   5678
1235                   4678
1236                   4578
1237                   4568
1238                   4567
.。。                   。。。
1678                   2345                             接下来进行数字的全排列例如被乘数部分 1234 组成形式有16中形式
1234,1243,1324,1342,1423,1432
2134,2143,2314,2341,2413,1431
3124,3142,3214,3241,3412,3421
4123,4132,4213,4231,4312,4321然后用集合把以上数字存储
乘数部分同上
每得到一个乘数便与集合的数字进行乘积,结果判断是否与原数字一样即可。而难点在于对算法的优化,此代码可以进一步优化,年假期间我会对此代码进行更新。

package test1;

import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
 public class Bloodsucker_Method {
     private static List<Character> numList=new ArrayList<Character>();
     private static List<Character> sortList=new ArrayList<Character>();
     private static List<Long> multiplierList=new ArrayList<Long>();
     private static int numHalfLength;
     private static long startNum=1;
     private static boolean falg=false;
     private static boolean satisfy=false;
     public static void main(String[] args) {
         int numLength;
         long endNum;
         System.out.println("1:查询一个数字是否是吸血鬼数字?\n2:查询n位数的所有吸血鬼数字");
         @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
         if(scanner.next().equals("1")){
             while(true) {
                 System.out.println("输入你想查询的数字");
                 String number = scanner.next();
                 if (number.length()%2!=0){
                     System.out.println("输入位数不是偶数,不满足吸血鬼数字规则");
                     }
                 else {
                     numHalfLength=number.length()/2;
                     startNum=Integer.parseInt(number);
                     f(number);
                     if(!satisfy) System.out.println(startNum+"不是吸血鬼数字");
                     break;
                     }
                 }
             }
         else {
             while(true) {
                 System.out.println("输入你想查询n位数的所有吸血鬼数字");
                 numLength = scanner.nextInt();
                 if (numLength%2!=0){
                     System.out.println("输入位数不是偶数,不满足吸血鬼数字规则");
                     }
                 else { break; }
                 }
             numHalfLength = numLength / 2;
             for (long i = 1; i < numLength; i++) {
                 startNum *= 10;
                 }
             endNum = startNum * 10;
             while (startNum < endNum){
                 numList.clear();
                 sortList.clear();
                 multiplierList.clear();
                 String number = Long.toString(startNum);
                 f(number);
                 satisfy = false;
                 startNum++;
                 }
             }
         }
     private static void f(String number){
         char[] chars = number.toCharArray();
         int k=0;
         StringBuffer buffer=new StringBuffer();
         buffer.append(chars[0]);
         prepareSplit(chars,k,buffer,number);
         }
     private static int prepareSplit(char a[],int k,StringBuffer buffer,String number){
         int length=2*numHalfLength;
         for (int i=k+1,j=0;j<=numHalfLength&&i<length;i++,j++){
             buffer.append(a[i]);
             if(buffer.length()>=numHalfLength){
                 multiplierSpilt(buffer,number);
             if(satisfy)return length;
             }
             else {
             k= prepareSplit(a, i, buffer, number);
             if(satisfy)return length;
             }
             }
         if(buffer.length()>0) {
             buffer.deleteCharAt(buffer.length() - 1);
             }
         return k;
         }
     private static void multiplierSpilt(StringBuffer buffer,String rigthNum){
         String leftNum=buffer.toString();
         buffer.deleteCharAt(buffer.length()-1);
         for(int i=0;i<numHalfLength;i++) {
             rigthNum= rigthNum.replaceFirst(leftNum.charAt(i) + "", "");
             }
         prrepareSort(leftNum,rigthNum);
         }
         private static void prrepareSort(String leftNum,String rigthNum){
             falg=false;
             for(int i=0;i<numHalfLength;i++){
                 numList.add(leftNum.charAt(i));
                 }
             sortNumberlist();            
             numList.clear();
             falg=true;
             for(int i=0;i<numHalfLength;i++){
                 numList.add(rigthNum.charAt(i));
                 }
             sortNumberlist();
             numList.clear();
             multiplierList.clear();
             }
         private static void sortNumberlist(){
             List<Character> list2= new ArrayList<>();
             list2.addAll(numList);
             int len1=sortList.size();
             int len2=len1+1;
             for (Character o : sortList) {
                 list2.remove(o);
                 }
             for (Character o : list2) {
                 sortList.add(o);
                 if(len2==numHalfLength){
                     validation();
                     if(satisfy)return;
                     }
                 else{ sortNumberlist();
                     }
                 sortList.remove(len1);
                     if(satisfy)return ;
                     }
             }
             private static void validation() {
                 Long num;
                 StringBuffer buffer = new StringBuffer();
                 for (int i = 0; i < numHalfLength; i++) buffer.append(sortList.get(i));
                 num = Long.parseLong(buffer.toString());
                 if(!falg) {
                     multiplierList.add(num);
                     }
                 else {
                     for ( long o : multiplierList) {
                         if(o*num==startNum){
                             satisfy=true;
                             System.out.println(startNum+"是吸血鬼数字");
                             System.out.println(o+" * "+num+"="+startNum);
                             return ;
                             }
                         }
                     }
                 }
        
        
 }

为中华之腾飞做出自己的贡献。

n位吸血鬼数字的算法相关推荐

  1. 4位吸血鬼数字的实现代码与解释

    今天在<Java编程思想>第四章中看到一道练习题,写程序找到所有的4位吸血鬼数字.因为第四章是讲控制流程,一开始始终将思路局限于利用循环进行穷举,但越想越复杂,最后查阅了相关资料,总结出了 ...

  2. java吸血鬼_4位吸血鬼数字的java实现思路与实例讲解

    这个问题来源于java编程思想一书,所谓"吸血鬼数字"就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列. ...

  3. Java杂谈——求所有的4位吸血鬼数字

    Java杂谈篇(一) [求所有的4位吸血鬼数字] 1.什么是吸血鬼数字? 2.方法思考 2.1.各种方法 2.2.关于上述第二个解决方法的解析 2.2.1.方法详情 2.2.2.方法详解 3.运行结果 ...

  4. 怎样轻松找出4位数的所有“吸血鬼”数字,多种高效算法详解

    关于吸血鬼数字算法问题,我也是读<java编程思想>中遇到的,觉得很有意思.于是,就去做了做.但因为我的粗心,读题的时候忽略了点问题,所以导致我的思路出现了岔口!(当时的思路就是想着把一个 ...

  5. 吸血鬼数字检验之java实现

    1吸血鬼数字介绍 2实现思路 3代码实例 1.吸血鬼数字介绍 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. ...

  6. 得到一个数字中每一位的数字

    学习编程也有一段时间了,随着学习的不断深入,我越来越体会到了算法的重要性,最近遇到了一些非常有意思的算法,比如打印水仙花数.将数字逆置,在这两个算法中会用到一个数字钟每一位的值 如:判断数字123是否 ...

  7. 数字存储示波器数字荧光算法

    先上视频,花了我一个多小时写的算法,主要是好久没碰这个程序了要重新熟悉,代码其实只增加了一二十行.使用的MCU是STM32F407. 数字存储示波器数字荧光算法演示 ​​​​​​​https://v. ...

  8. 吸血鬼数字java_Java求吸血鬼数算法(通用)

    /*吸血鬼数字是指位数为偶数的数字,可以由一 * 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 以两个0结尾的数字是不允许的. * * ...

  9. JavaScript实现判断32位的数字是否为正数isPositive算法(附完整源码)

    JavaScript实现判断32位的数字是否为正数isPositive算法(附完整源码) isPositive.js完整源代码 isPositive.js完整源代码 export default fu ...

  10. C语言重复加一个数的所有位数字的算法(附完整源码)

    C语言重复加一个数的所有位数字的算法 问题举例 C语言重复加一个数的所有位数字的算法完整源码(定义,实现,main函数测试) 问题举例 例如给定num = 38,过程类似于:3 + 8 = 11,1 ...

最新文章

  1. python3连接mysql,python3连接MySQL数据库实例详解
  2. Activity的用法(三):开启网页 (没有弹出浏览器,不清楚是什么原因)
  3. OpenCV中的数据结构
  4. php的cookie的函数,php setcookie()函数的使用简介
  5. 北邮计算机系统结构课件,TEC-8 运算器组成实验(北邮).ppt
  6. Markdown——编辑器语法——背景色
  7. python磁盘io_Python多线程同步、互斥锁、死锁
  8. bzoj1966 [AHOI2005]病毒检测 结论+暴力
  9. VMware网卡配置
  10. 网页上无缝滚动的实现
  11. gdb调试core文件
  12. php判断是否是浏览器请求,php 判断请求是否来自“手机浏览器”
  13. 微信公众号怎么发送模板消息 微信公众平台模板消息免费发送的技巧
  14. WEB应用log4j1.x升级到log4j2.17.1
  15. 计算机网络水晶头博客,网线水晶头接法顺序图解分享,这个简单口诀记好了(超实用)...
  16. 常微分方程(1):可分离变量的方程
  17. 我的专业作文300字计算机,以我的专业为题的作文(以我写一篇作文300字)
  18. 传统语音增强——基于先验信噪比的维纳滤波语音降噪算法
  19. 【数据库架构】NewSQL和PGXC
  20. 持NPDP证书在深圳可享受子女入学、医疗保健、安居保障等福利

热门文章

  1. 深度学习中常用的非线性激励函数
  2. C语言顺序表的12个基本操作(增删改查等)
  3. opencv for android(三):使用opencv摄像头竖屏和前后切换
  4. Java Web 后端技术可视化
  5. 邱锡鹏神经网络怎么样,邱锡鹏 神经网络pdf
  6. 背景图片自适应屏幕大小CSS写法
  7. SQL 笛卡尔积现象
  8. 尾矿库监测 GNSS北斗高精度定位终端机应用
  9. 原版Caffe在Windows10 VS2015 python3.7 CPU版本 详细安装笔记 BVLC caffe
  10. react视频教程百度云资源链接