当前位置: 首页 > 知识库问答 >
问题:

在自由范围内生成吸血鬼数量

劳昊明
2023-03-14

我正在编写一个生成吸血鬼号码的程序https://en.wikipedia.org/wiki/Vampire_number。

我有一个带有numberOfDigits参数的主函数,它必须是偶数。如果numberOfDigits等于4,那么我们在1000到9999范围内搜索吸血鬼号码--四位数。如果numberOfDigits等于6,那么我们搜索的是100000到999999之间的吸血鬼号码--这是六位数字。

编辑:我的目标是生成自由范围的吸血鬼数字,像4,6,8-a.java它可以做到,甚至更多(如果我可以绕过堆空间问题)。就在那时,我想要帮助的问题来了。

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 
 * @author re
 */
public class a {
    
    /**
     *
     * @param numberOfDigits {int}
     * @return ArrayList of Integer
     */
    public ArrayList<Integer> vdf(int numberOfDigits) {
        
        if ((numberOfDigits % 2) == 1) { 
            //or throw Exception of unrecognised format/variable?
            System.out.println("cant operate on odd argument");
            return new ArrayList<>();
        }
        long maxRange = 9;
        
        for (int i = 1; i < numberOfDigits; i++) {
            maxRange *= 10;
            maxRange += 9;
        }//numberOfDigits==4 then maxRange==9999, nOD==5 then maxRange==99999,..
        
        long minRange = 1;
        
        for (int i = 1; i < numberOfDigits; i++) {
            minRange *= 10;
        }//nOD==4 then minRange==1000, nOD==5 then minRange==10000, ..
   
        ArrayList<Integer> ret = new ArrayList<>();
        for (long i = minRange; i < maxRange; i++) {
            
            long a = i;
            
            long[] b = new long[numberOfDigits];
            
            for (int j = numberOfDigits-1; j >= 0 ; j--) {
                long c = a % 10;
                a = a / 10;
                b[j] = c;
            }
            
            int x = 0;
            int y = 0;
            ArrayList<long[]> list = permutations(b);
            b = null; //dont need now
            
            for(long[] s : list) {
                for (int j = 0; j < numberOfDigits/2; j++) {
                    x += s[(numberOfDigits/2)-j-1] * Math.pow(10, j);
                    y += s[numberOfDigits-j-1] * Math.pow(10, j);
                }
                StringBuilder builder = new StringBuilder();
                for (long t : s) {
                    builder.append(t);
                }
                String v = builder.toString();
                
                if ((v.charAt((v.length()/2)-1) != '0'||
                    v.charAt(v.length()-1) != '0') &&
                    x * y == i) {
                    ret.add(x);
                    ret.add(y);
                    System.out.println(x*y+"  "+x+" "+y);
                    break;
                }
                x = y = 0;
            }
        }
        System.out.printf("%d vampire numbers found\n", ret.size()/2);
        return ret;
    }
    
    /**
     * 
     *@return vdf(4)
     */
    public ArrayList<Integer> vdf() {
        return vdf(4);//without trailing zeros
    }
    
    /* permutation code copied from  
     * johk95
     * https://stackoverflow.com/a/20906510
     */
    private static ArrayList<long[]> permutations(long[] lol) {
        ArrayList<long[]> ret = new ArrayList<>();
        permutation(lol, 0, ret);
        return ret;
    }
    
    private static void permutation(long[] arr, int pos, ArrayList<long[]> list){
        if(arr.length - pos == 1)
            list.add(arr.clone());
        else
            for(int i = pos; i < arr.length; i++){
                swap(arr, pos, i);
                permutation(arr, pos+1, list);
                swap(arr, pos, i);
            }
    }

    private static void swap(long[] arr, int pos1, int pos2){
        long h = arr[pos1];
        arr[pos1] = arr[pos2];
        arr[pos2] = h;
    }
    
    public static void main(String[] args) {
        a a = new a();
        try{
            a.vdf(10); //TRY IT WITH 4, 6 or 8. <<<<
        }catch (java.lang.OutOfMemoryError e){
            System.err.println(e.getMessage());
        }
    }
}

编辑:http://ideone.com/3rhhep-上面的工作代码numberOfDigits==4。

共有1个答案

宰父单弓
2023-03-14
package testing;

import java.util.Arrays;


public class Testing
{
    final static int START = 11, END = 1000;
    public static void main(String[] args)
    {
        char[] kChar, checkChar;
        String kStr, checkStr;
        int k;
        for(int i=START; i<END; i++) {
                for(int i1=i; i1<100; i1++) {
                    k = i * i1;

                    kStr = Integer.toString(k);
                    checkStr = Integer.toString(i) + Integer.toString(i1);

                    //if(kStr.length() != 4) break;

                    kChar = kStr.toCharArray();
                    checkChar = checkStr.toCharArray();

                    Arrays.sort(kChar);
                    Arrays.sort(checkChar);

                    if(Arrays.equals(kChar, checkChar)) {
                        System.out.println(i + " * " + i1 + " = " + k);
                    }
                }
            }
    }
}

这将生成吸血鬼数字,只需修改开始和结束整数。

 类似资料:
  • 我正在解决一个问题,找出所有的4位吸血鬼数字。 吸血鬼数v=x*y被定义为一个具有'n'个偶数位数的数字,通过将一对'n/2'位数的数字(其中的数字以任意顺序取自原始数)x和y相乘而形成。如果v是吸血鬼的数字,那么X&Y和被称为它的“尖牙”。 吸血鬼数量的例子有: 我曾经尝试过蛮力算法,将给定数字的不同数字组合在一起,并将它们相乘。但这种方法效率很低,而且占用大量时间。 这个问题有没有更高效的算法

  • 问题内容: 如何在给定范围之间生成奇数随机数。 对于例如:对于1到6之间的范围。随机编号为3或1或5 产生随机数的方法: 请参阅如何在Java中生成特定范围内的随机整数? 产生奇数随机数的方法 此函数将始终将2转换为3而不是1。我们能否使它成为一个更随机的函数,该函数有时将2转换为3,有时转换为1? 问题答案: 假设max为包容性,我建议以下几点: 它导致所有奇数之间的偶数分布。

  • 本文向大家介绍4位吸血鬼数字的java实现思路与实例讲解,包括了4位吸血鬼数字的java实现思路与实例讲解的使用技巧和注意事项,需要的朋友参考一下 这个问题来源于Java编程思想一书,所谓“吸血鬼数字”就是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列。例如: 1260=21*60,1827=21*87,2187=27*81

  • 如何在一定范围内生成安全的统一随机数?范围可能在0到100之间。(上限不是2的幂)。 <代码>java。安全SecureRandom似乎提供了范围0。。2^n。

  • 问题内容: 我需要生成一个范围内的随机唯一数字吗?怎么做 ? 我可以通过生成随机数 我知道这段代码不好,所以我需要一个更好的优化版本代码!帮帮我 ! 例如:如果我需要在1到15之间生成3个数字,它们应该像5、9、1而不是3,1,2 [具有1-3(我要生成的数字)] 问题答案: 以随机顺序排列数字范围的数组: 包装功能: 例: 结果:

  • 本文向大家介绍Java 生成给定范围内的随机数,包括了Java 生成给定范围内的随机数的使用技巧和注意事项,需要的朋友参考一下 为了生成给定范围内的随机数,Java代码如下- 示例 输出结果 名为Demo的类包含主要功能。在这里,将创建一个新的随机实例以及一个新的数组列表。创建随机元素并将其分配给变量。使用add函数将这些随机变量添加到列表中。这些元素显示在控制台上。