Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Суть задачи, есть число, например: 10220102. Нужен алгоритм который позволит перебрать все варианты этого числа, где нули можно заменять 1 и 2, например: 10220112, 10220122, 10221102, 10221112, 10221122, 10222102, 10222112, 10222122 и т. д. Число может быть максимум десятизначным и иметь разное количество нулей.
14 фев 14, 17:13    [15569554]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
Glory
Member

Откуда:
Сообщений: 104760
hanko_nikita
Нужен алгоритм который позволит перебрать все варианты этого числа, где нули можно заменять 1 и 2

Преобразуете число в строку.
Парсите на позиции.
14 фев 14, 17:16    [15569566]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Glory
hanko_nikita
Нужен алгоритм который позволит перебрать все варианты этого числа, где нули можно заменять 1 и 2

Преобразуете число в строку.
Парсите на позиции.


Можно и не преобразовывая в строку находить на каких позициях находятся нули и в зависимости от этого прибавлять 1,10,100...2,20,200... Вопрос именно в алгоритме переборки всех возможных вариантов...
14 фев 14, 17:25    [15569617]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
Glory
Member

Откуда:
Сообщений: 104760
hanko_nikita
Можно и не преобразовывая в строку находить на каких позициях находятся нули и в зависимости от этого прибавлять 1,10,100...2,20,200... Вопрос именно в алгоритме переборки всех возможных вариантов...

Нужно не просто найти номера позиций, а получить из них набор записей. Соединение с которым и даст все переборы
14 фев 14, 17:34    [15569654]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Glory
hanko_nikita
Можно и не преобразовывая в строку находить на каких позициях находятся нули и в зависимости от этого прибавлять 1,10,100...2,20,200... Вопрос именно в алгоритме переборки всех возможных вариантов...

Нужно не просто найти номера позиций, а получить из них набор записей. Соединение с которым и даст все переборы

Честно говоря, не совсем понял, не могли бы вы на пальцах объяснить?
14 фев 14, 17:43    [15569692]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
Glory
Member

Откуда:
Сообщений: 104760
hanko_nikita
Честно говоря, не совсем понял, не могли бы вы на пальцах объяснить?


declare @t table(nr int, value char(1))

insert @t values(2, '0')
insert @t values(4, '0')
insert @t values(7, '0')

select * from @t a cross join @t b
14 фев 14, 17:48    [15569712]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Glory
hanko_nikita
Честно говоря, не совсем понял, не могли бы вы на пальцах объяснить?


declare @t table(nr int, value char(1))

insert @t values(2, '0')
insert @t values(4, '0')
insert @t values(7, '0')

select * from @t a cross join @t b


Можно вас попросить на примере вот этого числа 10220102, построить переборку.
14 фев 14, 17:57    [15569759]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 630
Подсчитайте количество нулей в строке (ZeroCount).
Приджойните таблицу со значениями N = от 1 до (ZeroCount) по условию 1=1
Приджойните вторую таблицу со значениями Х {1,2} по условию 1=1
Каждое N преобразуйте в битовую маску.
Если бит в маске = 1, соответствующий 0 в строке меняйте на текущий Х.



Как в том анекдоте: это - "стратегия" а уж как это реализовать тактически и практически = совсем другая задача.
14 фев 14, 18:13    [15569846]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Mikle83,
Пока я не совсем понял стратегию( ))... но вот как получить набор всевозможных вариантов я понял?
у меня получилось так, в зависимости от количества 0, количество join, для 5 нулей 4 join
declare @t table(nr int)

insert @t values(0)
insert @t values(1)
insert @t values(2)

select * from @t a 
cross join @t b
cross join @t c
cross join @t d
cross join @t f


select * from @t


Если возможно покажите пожалуйста на конкретном примере 10220102, так мне будет понятно, спасибо!
14 фев 14, 18:42    [15569972]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
;with Number as (
	select * from( values
	(2,10220102),(1,110202)
	)values_Number(i,n))
,rec as(
   select i, n, number,stuff(n,number,1,q)r
      from Number n
      cross apply(
         select v.number, c
         from master..spt_values v
         cross apply(select SUBSTRING(convert(varchar,n),v.number,1) c)c 
         where v.type='P' and v.number between 1 and len(n) and c='0'
         )v
      cross apply(select 'o' union all select 'x')q(q)
   union all
   select i,n, v.number,stuff(r,v.number,1,q)r
      from rec r
      cross apply(
         select v.number, SUBSTRING(r,v.number,1) c
         from master..spt_values v 
         cross apply(select SUBSTRING(r,v.number,1) c)c 
         where v.type='P' and v.number between 1 and len(r) and v.number>r.number and c='0'
         )v
      cross apply(select 'o' union all select 'x')q(q)
   )
select i,n,r from rec
union all
select i,n,convert(varchar,n) from Number
order by i,r
14 фев 14, 18:43    [15569978]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с алгоритмом  [new]
hanko_nikita
Member

Откуда:
Сообщений: 71
Cygapb-007,
Большое Вам спасибо! Буду разбираться))...
14 фев 14, 19:34    [15570208]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить