Eu tenho um número inteiro N. Eu tenho que encontrar o menor número inteiro maior que N que não contenha nenhum dígito além de 0 ou 1. Por exemplo: Se, N = 12
então, a resposta é 100
. Eu codifiquei uma abordagem de força bruta em C ++.
int main() {
long long n;
cin >> n;
for (long long i = n + 1; ; i++) {
long long temp = i;
bool ok = true;
while (temp != 0) {
if ( (temp % 10) != 0 && (temp % 10) != 1) {
ok = false;
break;
}
temp /= 10;
}
if (ok == true) {
cout << i << endl;
break;
}
}
}
O problema é que minha abordagem é muito lenta. Eu acredito que existe uma abordagem muito eficiente para resolver isso. Como posso resolver esse problema com eficiência?
N
permitido? Além disso, isso é difícil, pois você corre o risco de transbordar seu tipo. Quais são os limitesN
?Respostas:
Incremento N,
Começando pela esquerda, digitalize até encontrar um dígito acima de 1. Incremente o número parcial antes dele e zere o resto.
Por exemplo
Prova:
O número solicitado deve ser pelo menos N + 1, é por isso que incrementamos. Agora estamos procurando um número maior ou igual.
Vamos chamar o prefixo de dígitos 0/1 iniciais e sufixo o que vem depois. Devemos substituir o primeiro dígito do sufixo por um zero e definir um prefixo maior. O menor prefixo que se encaixa é o prefixo atual mais um. E o menor sufixo que se encaixa é todos os zeros.
Atualizar:
Esqueci de especificar que o prefixo deve ser incrementado como um número binário , caso contrário, dígitos proibidos poderão aparecer.
fonte
Outra possibilidade seria a seguinte:
Você começa com o maior número decimal do tipo "1111111 ... 1111" suportado pelo tipo de dados usado
O algoritmo assume que a entrada é menor que esse número; caso contrário, você terá que usar outro tipo de dados.
Exemplo: Ao usar
long long
, você começa com o número1111111111111111111
.Exemplo
Prova de correção:
Processamos dígito por dígito neste algoritmo. Em cada etapa, existem dígitos cujo valor já é conhecido e dígitos cujos valores ainda não são conhecidos.
Em cada etapa, analisamos o dígito desconhecido mais à esquerda.
Definimos esse dígito para "0" e todos os outros dígitos desconhecidos para "1". Como o dígito a ser sondado é o mais significativo dos dígitos desconhecidos, o número resultante é o maior número possível, sendo esse dígito um "0". Se esse número for menor ou igual à entrada, o dígito que está sendo testado deve ser um "1".
Por outro lado, o número resultante é menor que todos os números possíveis, onde o dígito que está sendo sondado é um "1". Se o número resultante for maior que a entrada, o dígito deverá ser "0".
Isso significa que podemos calcular um dígito em cada etapa.
Código C
(O código C também deve funcionar em C ++):
fonte
Deixe-me sugerir algumas alternativas.
I. Incrementar. Considere uma modificação do método @YvesDaoust.
(a) se for menor que 2, deixe tudo como está
(b) caso contrário, defina-o como 0 e aumente
Exemplos:
Você obtém resultado no formato decimal.
II Dividindo.
(a) se M exceder 1 e aumente D
(b) caso contrário aumente a soma em M * 10 k , onde k é o número da iteração atual (começando com 0)
Exemplo 1:
Exemplo 2:
Exemplo 3:
Exemplo 4:
fonte