Pesquisar este blog

Livros Recomendados

domingo, 6 de setembro de 2020

URI - 2157 - Sequência Espelho - Strings - C e C++

Plataforma: URI

Problema2157

Linguagens: C e C++

Soluções:

Este exercício foi resolvido em C e C++, sendo que em C++ eu fiz de duas formas.

Começando pela solução em C:

A estratégia foi utilizar uma estrutura de repetição (for) e imprimir todos os do menor ao maior, inclusive. Depois o contrário, do maior até o menor. Mas existe um porém: na visão contrária o 10 vira 01, o 13 vira 31 e assim por diante, o que exige mais uma manipulação no valor. Pra isso usei a função sprintf e joguei cada número para este array de char que chamei de str. Neste array, fiz a impressão dele ao contrário, ou seja, partindo do maior índice (strlen(str)-1 ou tamanho-1) até o índice 0 (primeiro dígito mais significativo do valor). Foi um exercício divertido de resolver!

#include <stdio.h>
#include <stdlib.h>

int main() {
    
    int n, menor, maior, i, j;
    scanf("%d", &n);
    
    char str[6];
    
    while (n--) {
        scanf("%d %d", &menor, &maior);
        for (i = menor; i <= maior; i++)
            printf("%d", i);
        for (i = maior; i >= menor; i--) {
            sprintf(str, "%d", i);
            for (j = strlen(str)-1; j >= 0; j--)
                printf("%c", str[j]);
        }
        printf("\n");
    }

    return 0;
}

Nessa primeira solução em C++ eu fiz um for para percorrer do inicio ao fim. Ao longo disso, o valor é escrito e uma string vai concatenando todos os números. Para isso, basta atribuir o valor do número à string com o operador += e fazer a conversão do número para string com a função to_string(). Ao final, esta string é invertida com a função reverse e seu valor é impresso na tela. Essa solução fica bem mais simples para o programador

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>  
#include <string>  
 
using namespace std;


int main() {
 int n, init, end;
 cin >> n;
 while(n--){
  cin >> init >> end; 
  string s;
  for(int i = init;i<=end;i++){
   cout << i;
   s += to_string(i);
  }
  reverse(s.begin(),s.end());
  cout << s << endl;
 }
    return 0;
}

A minha solução alternativa até que fica parecida, mas ela utiliza variáveis unsigned int, sendo mais específico, já que não há valor negativo para n, maior e menor.

Outra diferença foi a criação do segundo for; no primeiro, imprime-se os valores na ordem, no segundo, o valor é enviado um a um para a string e já é invertido e impresso. É apenas outra forma de abordar o problema. E você, como resolveu o exercício 2157?

#include <algorithm>
#include <iostream>

using namespace std;

int main() {
    
    unsigned int n, menor, maior;
    cin >> n;
    
    while (n--) {
        cin >> menor >> maior;
        for (int i = menor; i <= maior; i++)
            cout << i;
        for (int i = maior; i >= menor; i--) {
            string reverso = to_string(i);
            reverse(reverso.begin(), reverso.end());
            cout << reverso;
        }
        cout << endl;
    }

    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas