2015-06-30 2 views
0

Я пишу программу, которая генерирует Номера вампировhttps://en.wikipedia.org/wiki/Vampire_number.Генерация номеров вампиров в свободном диапазоне

У меня есть основная функция с numberOfDigits аргумент, который должен быть даже. Если numberOfDigits равно 4, мы ищем номера вампиров в диапазоне от 1000 до 9999 - четыре цифры. Если numberOfDigits равно 6, то мы ищем номера вампиров от 100000 до 999999 - это шесть цифр.

В следующем файле, когда я хочу найти номера вампиров в диапазоне 10 цифр, пространство кучи Java кричит. Обратите внимание, что у меня есть настройки по умолчанию для памяти. Но для, numberOfDigits == 4, 6 или 8, код работает правильно. (сравниваемый выход до https://oeis.org/A014575/b014575.txt, https://oeis.org/A014575). Поэтому я хочу спросить,

  1. Что я могу сделать для оптимизации кода? Я думал об использовании String с цифрами внутри, а не long/BigInteger. Я хочу «опустить» эту проблему кучи. Сохранение больших чисел в файл будет слишком медленным, верно?

  2. Мой друг написал (большойNum.cpp) http://pastebin.com/0HHdE848 - класс в C++, чтобы работать на больших количествах. Может быть, с помощью сообщества я мог бы реализовать это в моей a.java? Что более важно - было бы полезно для моей проблемы?

  3. редактировать: Моя цель состоит в том, чтобы генерировать свободный диапазон чисел вампира, как 4,6,8 - a.java он может сделать это, даже больше (если я могу обойти проблему пространства кучи). И это когда мои вопросы, чтобы помочь приходит.

a.java (перестановка кода из johk95, https://stackoverflow.com/a/20906510)

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.

+0

Выберите язык, C++ или Java. Это похоже на Java, потому что C++ не имеет 'ArrayList' (если вы его не написали). –

+0

@ThomasMatthews файл a.java написан на Java мной. Я только скопировал функции для перестановок от пользователя johk95. – nanomader94

ответ

1
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); 
        } 
       } 
      } 
    } 
} 

В этом будет генерировать номера вампиров, просто измените начальные и конечные целые числа.

+0

Спасибо за отзыв и ваш код. Но что, если я хочу сгенерировать, например, 14 цифр чисел вампира? И я хочу сделать это примерно так: generateVampireNumbers (/ * numberOfDigits */12); Я не хочу редактировать файл каждый раз. Моя основная цель - «опустить» или обойти проблему кучи, используя какой-то сложный метод. Может, Струны, как я упомянул в своем вопросе? – nanomader94

+0

@ nanomader94 это переменная, сделать ее не финальной и просто изменить ее с помощью кода – stealth9799

Смежные вопросы