Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 1120. Mostrar todas as postagens
Mostrando postagens com marcador 1120. Mostrar todas as postagens

sábado, 2 de janeiro de 2021

URI - 1120 - Revisão de Contrato - Strings - C

Plataforma: URI
Problema1120

Enunciado:
Durante anos, todos os contratos da Associação de Contratos da Modernolândia (ACM) foram datilografados em uma velha máquina de datilografia. Recentemente Sr. Miranda, um dos contadores da ACM, percebeu que a máquina apresentava falha em um, e apenas um, dos dígitos numéricos. Mais especificamente, o dígito falho, quando datilografado, não é impresso na folha, como se a tecla correspondente não tivesse sido pressionada. Ele percebeu que isso poderia ter alterado os valores numéricos representados nos contratos e, preocupado com a contabilidade, quer saber, a partir dos valores originais negociados nos contratos, que ele mantinha em anotações manuscritas, quais os valores de fato representados nos contratos. Por exemplo, se a máquina apresenta falha no dígito 5, o valor 1500 seria datilografado no contrato como 100, pois o 5 não seria impresso. Note que o Sr. Miranda quer saber o valor numérico representado no contrato, ou seja, nessa mesma máquina, o número 5000 corresponde ao valor numérico 0, e não 000 (como ele de fato aparece impresso).

Linguagem: C

Solução: 

Nesta solução, criei uma função getTamanho para não precisar incluir a biblioteca string.h e obter o tamanho da cadeia de caracteres informada. Utilizei um array resposta para obter os dígitos informados, exceto quando o dígito é igual a n, portanto ele tem a resposta e é só imprimi-lo. O caso em que j == i é o último caso, para imprimir zero e quebrar a linha.

#include <stdio.h>

int getTamanho(char *palavra) {
    int i = 0;
    
    while (palavra[i] != '\0')
        i++;
    
    return i;
}

int main() {
    
    int n, i, j, k, digito;
    char str[101], resposta[101];
    
    while (scanf("%i %s", &n, str) != EOF) {
        
        if (n == 0 && !strcmp(str, "0"))
            exit(0);
        
        for (i = 0, j = 0; i < getTamanho(str); i++) {
            
            digito = str[i] - '0';
            
            if (n != digito)
                resposta[j++] = str[i];
                
        }
        
        for (i = 0; i < j; i++)
            if (resposta[i] != '0')
                break;
        
        if (j == i)
            printf("0\n");
        else {
            for (k = i; k < j; k++)
                printf("%c", resposta[k]);
            
            printf("\n");
        }
    }

    return 0;
}

URI - 1120 - Revisão de Contrato - Strings - C++ - Solução Alternativa

Plataforma: URI
Problema1120

Enunciado:
Durante anos, todos os contratos da Associação de Contratos da Modernolândia (ACM) foram datilografados em uma velha máquina de datilografia. Recentemente Sr. Miranda, um dos contadores da ACM, percebeu que a máquina apresentava falha em um, e apenas um, dos dígitos numéricos. Mais especificamente, o dígito falho, quando datilografado, não é impresso na folha, como se a tecla correspondente não tivesse sido pressionada. Ele percebeu que isso poderia ter alterado os valores numéricos representados nos contratos e, preocupado com a contabilidade, quer saber, a partir dos valores originais negociados nos contratos, que ele mantinha em anotações manuscritas, quais os valores de fato representados nos contratos. Por exemplo, se a máquina apresenta falha no dígito 5, o valor 1500 seria datilografado no contrato como 100, pois o 5 não seria impresso. Note que o Sr. Miranda quer saber o valor numérico representado no contrato, ou seja, nessa mesma máquina, o número 5000 corresponde ao valor numérico 0, e não 000 (como ele de fato aparece impresso).

Linguagem: C++

Solução: 

Basta verificar se o dígito atual é igual ao número n. Se não for, salva na string resposta. Foi feito também um teste de zeros à esquerda, pois eles devem ser descartados. 

#include <iostream>

using namespace std;

int getTamanho(string palavra) {
    int i = 0;
    
    while (palavra[i] != '\0')
        i++;
    
    return i;
}

int main() {
    
    int n;
    string str;
    
    while (cin >> n >> str) {
        
        if (n == 0 && !str.compare("0"))
            exit(0);
        
        string resposta = "";
        
        for (int i = 0; i < getTamanho(str); i++) {
            
            int digito = str[i] - '0';
            
            if (n  != digito)
                resposta.append(1, str[i]);
                
        }
        
        int zerosAEsquerda;
        for (zerosAEsquerda = 0; zerosAEsquerda < getTamanho(resposta); zerosAEsquerda++)
            if (resposta[zerosAEsquerda] != '0')
                break;
        
        string final = resposta.substr(zerosAEsquerda, getTamanho(resposta));
        
        if (getTamanho(final) == 0)
            final = "0";
            
        cout << final << endl;
    }

    return 0;
}

segunda-feira, 17 de agosto de 2020

URI - 1120 - Revisão de Contrato - Strings - C++

Plataforma: URI
Problema1120

Enunciado:
Durante anos, todos os contratos da Associação de Contratos da Modernolândia (ACM) foram datilografados em uma velha máquina de datilografia. Recentemente Sr. Miranda, um dos contadores da ACM, percebeu que a máquina apresentava falha em um, e apenas um, dos dígitos numéricos. Mais especificamente, o dígito falho, quando datilografado, não é impresso na folha, como se a tecla correspondente não tivesse sido pressionada. Ele percebeu que isso poderia ter alterado os valores numéricos representados nos contratos e, preocupado com a contabilidade, quer saber, a partir dos valores originais negociados nos contratos, que ele mantinha em anotações manuscritas, quais os valores de fato representados nos contratos. Por exemplo, se a máquina apresenta falha no dígito 5, o valor 1500 seria datilografado no contrato como 100, pois o 5 não seria impresso. Note que o Sr. Miranda quer saber o valor numérico representado no contrato, ou seja, nessa mesma máquina, o número 5000 corresponde ao valor numérico 0, e não 000 (como ele de fato aparece impresso).

Linguagem: C++

Solução:
É verificado digito por digito para montar a string final. Além disso, é feita uma verificação se o primeiro digito da string final seria 0, neste caso ele não deve ser impresso.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
int main() {
  char digito;
  string teste;
  cin >> digito >> teste;
  while(digito!='0' and teste[0]!='0'){
   string final = "";
   bool first = true;
   for(int i=0;i<teste.length();i++){
    if(digito!=teste[i]){
     if(!first or teste[i]!='0'){
      final += teste[i];
      first = false;
     }
    }
   }
   if(first) cout << 0 << endl;
   else cout << final << endl;
   cin >> digito >> teste;
  }
 
    return 0;
}

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