Алгоритм получения числовых рядов - PullRequest
2 голосов
/ 11 июня 2019

Я не уверен, как решить эту проблему ... Я пробовал много вещей, и кажется, что это не должно быть так сложно, но не туда добраться ...

Возможно ли эточтобы создать функцию "серия (_x)", которая производит это:

example of wanted result

Функция, например, должна быть myfunction (11) => 211

Ответы [ 4 ]

2 голосов
/ 11 июня 2019

Термины становятся суффиксом для следующих терминов.Смотрите картинку ниже для большей ясности.Ящики с одинаковым цветом повторяются.Таким образом, мы могли бы просто продолжать добавлять 1 и 2 для предыдущих результатов.

enter image description here

Код (в Java):

public class Solution {
    public static void main(String[] args) {
        List<String> ans = solve(10);
        for(int i=0;i<ans.size();++i) System.out.println(ans.get(i));
    }

    private static List<String> solve(int terms){
        List<String> ans = new ArrayList<>();
        String[] digits = new String[]{"1","2"};
        ans.add("1");
        if(terms == 1) return ans;
        ans.add("2");
        if(terms == 2) return ans;

        List<String> final_result = new ArrayList<>();
        final_result.addAll(ans);
        terms -= 2;//since 2 numbers are already added

        while(terms > 0){           
            List<String> temp = new ArrayList<>();
            for(String s : digits){
                 for(int j=0;j<ans.size() && terms > 0;++j){
                     temp.add(s + ans.get(j));
                     terms--;
                 }
            }
            ans = temp;
            final_result.addAll(ans);
        }       

        return final_result;
    }
}
2 голосов
/ 11 июня 2019

Этот совет должен вам помочь ... Он не совсем двоичный, но он близок.Дайте мне знать, если вам понадобится дополнительная помощь

   0    ->    -     ->    -
   1    ->    -     ->    -
  10    ->    0     ->    1
  11    ->    1     ->    2
 100    ->   00     ->   11
 101    ->   01     ->   12
 110    ->   10     ->   21
 111    ->   11     ->   22
1000    ->  000     ->  111
1001    ->  001     ->  112
1010    ->  010     ->  121
1011    ->  011     ->  122
1100    ->  100     ->  211
1101    ->  101     ->  212
1110    ->  110     ->  221
1111    ->  111     ->  222

Редактировать: мне не понравилось, как я заказал столбцы, поэтому я поменял местами 2 и 3

Подход Python

Первое, что нам нужно сделать, это создать двоичные строки
в Python, это можно сделать с помощью bin(number)
Однако это вернет число в виде 0b101
Мы можем легко убрать0b с самого начала, сообщая python, что нам не нужны первые два символа, но нам нужны все остальные.Код для этого: bin(number)[2:] левая сторона: говорит, что начинается с двух пробелов, а поскольку правая сторона пуста, переходите к концу

Теперь у нас есть двоичные числа, но нам нужно убратьпервый номер.К счастью, мы уже знаем, как убрать начальные символы, поэтому измените эту строку на bin(number)[3:].

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

# we already had this
binary = bin(user_in + 1)[3:]

new = ""
for char in binary:
    # add to the string the character + 1
    new += str(int(char) + 1)

И все готово.Этот фрагмент будет преобразован из десятичной в любую систему.Вы можете заметить одну вещь: это решение будет смещено на единицу (2 будет 1, 3 будет 2), мы можем исправить это, просто добавив единицу к пользовательскому вводу, прежде чем мы начнем.

окончательный код с некоторымиудобство (цикл while и оператор print)

while True:
    user_in = int(input("enter number: "))
    binary = bin(user_in + 1)[3:]
    new = ""
    for char in binary:
        new += str(int(char) + 1)

    print(user_in, "\t->\t", binary, "\t->\t", new)
1 голос
/ 11 июня 2019

Согласно A000055

Мы должны выполнить 3 шагов:

  1. Конвертировать value + 1 в базу 2
  2. Удалить 1-е 1
  3. Добавить 1 к остальным цифрам

Например, для 11 у нас есть

  1. Преобразование 11 + 1 == 12 в двоичный файл: 1100
  2. Снятие 1-го 1: 100
  3. Добавление 1 к остальным цифрам: 211

Итак, 11 имеет 211 представление.

C # код:

private static String MyCode(int value) =>
  string.Concat(Convert
    .ToString(value + 1, 2)       // To Binary
    .Skip(1)                      // Skip (Remove) 1st 1
    .Select(c => (char)(c + 1))); // Add 1 to the rest digits

Демо-версия:

var result = Enumerable
  .Range(1, 22)
  .Select(value => $"{MyCode(value),4} : {value,2}");

Console.Write(string.Join(Emvironment.NewLine, result));

Результат:

   1 :  1
   2 :  2
  11 :  3
  12 :  4
  21 :  5
  22 :  6
 111 :  7
 112 :  8
 121 :  9
 122 : 10
 211 : 11
 212 : 12
 221 : 13
 222 : 14
1111 : 15
1112 : 16
1121 : 17
1122 : 18
1211 : 19
1212 : 20
1221 : 21
1222 : 22
0 голосов
/ 11 июня 2019

В VB.NET, показывающий как подсчет по формуле base-3, так и по формуле OEIS, без попыток оптимизации:

Module Module1

    Function OEIS_A007931(n As Integer) As Integer
        ' From https://oeis.org/A007931

        Dim m = Math.Floor(Math.Log(n + 1) / Math.Log(2))
        Dim x = 0
        For j = 0 To m - 1
            Dim b = Math.Floor((n + 1 - 2 ^ m) / (2 ^ j))
            x += CInt((1 + b Mod 2) * 10 ^ j)
        Next

        Return x

    End Function

    Function ToBase3(n As Integer) As String
        Dim s = ""
        While n > 0
            s = (n Mod 3).ToString() & s
            n \= 3
        End While

        Return s

    End Function

    Function SkipZeros(n As Integer) As String
        Dim i = 0
        Dim num = 1
        Dim s = ""

        While i < n
            s = ToBase3(num)
            If s.IndexOf("0"c) = -1 Then
                i += 1
            End If

            num += 1

        End While

        Return s

    End Function

    Sub Main()
        Console.WriteLine("A007931  Base3   ITERATION")
        For i = 1 To 22
            Console.WriteLine(OEIS_A007931(i).ToString().PadLeft(7) & SkipZeros(i).PadLeft(7) & i.ToString().PadLeft(11))
        Next

        Console.ReadLine()

    End Sub

End Module

Выходы:

A007931  Base3   ITERATION
      1      1          1
      2      2          2
     11     11          3
     12     12          4
     21     21          5
     22     22          6
    111    111          7
    112    112          8
    121    121          9
    122    122         10
    211    211         11
    212    212         12
    221    221         13
    222    222         14
   1111   1111         15
   1112   1112         16
   1121   1121         17
   1122   1122         18
   1211   1211         19
   1212   1212         20
   1221   1221         21
   1222   1222         22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...