| 
1 | 1 | package com.thealgorithms.maths;  | 
2 | 2 | 
 
  | 
3 | 3 | import java.util.ArrayList;  | 
4 |  | -import java.util.Collections;  | 
5 | 4 | 
 
  | 
6 | 5 | /**  | 
7 |  | - * n number theory, a vampire number (or true vampire number) is a composite  | 
 | 6 | + * In number theory, a vampire number (or true vampire number) is a composite  | 
8 | 7 |  * natural number with an even number of digits, that can be factored into two  | 
9 | 8 |  * natural numbers each with half as many digits as the original number and not  | 
10 | 9 |  * both with trailing zeroes, where the two factors contain precisely all the  | 
11 | 10 |  * digits of the original number, in any order, counting multiplicity. The first  | 
12 |  | - * vampire number is 1260 = 21 × 60. *  | 
 | 11 | + * vampire number is 1260 = 21 × 60.  | 
13 | 12 |  *  | 
14 |  | - * <p>  | 
15 |  | - * link: https://en.wikipedia.org/wiki/Vampire_number *  | 
16 |  | - *  | 
17 |  | - * <p>  | 
 | 13 | + * @see <a href='https://en.wikipedia.org/wiki/Vampire_number'>Vampire number on Wikipedia</a>  | 
18 | 14 |  */  | 
19 | 15 | public final class VampireNumber {  | 
 | 16 | +    // Forbid instantiation.  | 
20 | 17 |     private VampireNumber() {  | 
21 | 18 |     }  | 
22 | 19 | 
 
  | 
23 |  | -    public static void main(String[] args) {  | 
24 |  | -        test(10, 1000);  | 
25 |  | -    }  | 
26 |  | - | 
27 |  | -    static void test(int startValue, int stopValue) {  | 
28 |  | -        int countofRes = 1;  | 
29 |  | -        StringBuilder res = new StringBuilder();  | 
30 |  | - | 
31 |  | -        for (int i = startValue; i <= stopValue; i++) {  | 
32 |  | -            for (int j = i; j <= stopValue; j++) {  | 
33 |  | -                // System.out.println(i+ " "+ j);  | 
34 |  | -                if (isVampireNumber(i, j, true)) {  | 
35 |  | -                    countofRes++;  | 
36 |  | -                    res.append("").append(countofRes).append(": = ( ").append(i).append(",").append(j).append(" = ").append(i * j).append(")").append("\n");  | 
37 |  | -                }  | 
38 |  | -            }  | 
39 |  | -        }  | 
40 |  | -        System.out.println(res);  | 
41 |  | -    }  | 
42 |  | - | 
43 |  | -    static boolean isVampireNumber(int a, int b, boolean noPseudoVamireNumbers) {  | 
44 |  | -        // this is for pseudoVampireNumbers  pseudovampire number need not be of length n/2 digits  | 
45 |  | -        // for example 126 = 6 x 21  | 
46 |  | -        if (noPseudoVamireNumbers) {  | 
47 |  | -            if (a * 10 <= b || b * 10 <= a) {  | 
48 |  | -                return false;  | 
49 |  | -            }  | 
 | 20 | +    static boolean isVampireNumber(int a, int b, boolean ignorePseudoVampireNumbers) {  | 
 | 21 | +        // Pseudo vampire numbers don't have to be of n/2 digits. E.g., 126 = 6 x 21 is such a number.  | 
 | 22 | +        if (ignorePseudoVampireNumbers && String.valueOf(a).length() != String.valueOf(b).length()) {  | 
 | 23 | +            return false;  | 
50 | 24 |         }  | 
51 | 25 | 
 
  | 
52 |  | -        String mulDigits = splitIntoDigits(a * b, 0);  | 
53 |  | -        String faktorDigits = splitIntoDigits(a, b);  | 
 | 26 | +        String mulDigits = splitIntoSortedDigits(a * b);  | 
 | 27 | +        String factorDigits = splitIntoSortedDigits(a, b);  | 
54 | 28 | 
 
  | 
55 |  | -        return mulDigits.equals(faktorDigits);  | 
 | 29 | +        return mulDigits.equals(factorDigits);  | 
56 | 30 |     }  | 
57 | 31 | 
 
  | 
58 |  | -    // methode to Split the numbers to Digits  | 
59 |  | -    static String splitIntoDigits(int num, int num2) {  | 
60 |  | -        StringBuilder res = new StringBuilder();  | 
61 |  | - | 
 | 32 | +    // Method to split a pair of numbers to digits and sort them in the ascending order.  | 
 | 33 | +    static String splitIntoSortedDigits(int... nums) {  | 
 | 34 | +        // Collect all digits in a list.  | 
62 | 35 |         ArrayList<Integer> digits = new ArrayList<>();  | 
63 |  | -        while (num > 0) {  | 
64 |  | -            digits.add(num % 10);  | 
65 |  | -            num /= 10;  | 
66 |  | -        }  | 
67 |  | -        while (num2 > 0) {  | 
68 |  | -            digits.add(num2 % 10);  | 
69 |  | -            num2 /= 10;  | 
70 |  | -        }  | 
71 |  | -        Collections.sort(digits);  | 
72 |  | -        for (int i : digits) {  | 
73 |  | -            res.append(i);  | 
 | 36 | +        for (int num : nums) {  | 
 | 37 | +            while (num > 0) {  | 
 | 38 | +                digits.add(num % 10);  | 
 | 39 | +                num /= 10;  | 
 | 40 | +            }  | 
74 | 41 |         }  | 
75 | 42 | 
 
  | 
 | 43 | +        // Sort all digits and convert to String.  | 
 | 44 | +        StringBuilder res = new StringBuilder();  | 
 | 45 | +        digits.stream().sorted().forEach(res::append);  | 
76 | 46 |         return res.toString();  | 
77 | 47 |     }  | 
78 | 48 | }  | 
0 commit comments