Resolvi o problema Processador Amigável de Inteiros de formas um pouco diferentes. Tenho duas soluções em C++ e uma em C e trago aqui para compartilhar com vocês. Caso tenham soluções diferentes, comentem!
Plataforma: URI (BEECROWD)
Problema: 1287
Enunciado:
Computadores estão presentes em uma porcentagem significante de casas pelo mundo e, como programadores, somos responsáveis por criar interfaces que todos possam usar. Interfaces de usuário precisam ser flexíveis de forma que se um usuário comete um erro não fatal, a interface ainda pode deduzir o que o usuário queria dizer. Sua tarefa é escrever um programa que processe um texto de entrada representando um inteiro, porém, como esta é uma interface de usuário, não seremos muito rígidos com o usuário: 1. Se o usuário digita a letra "O" ou "o", assumimos que ele queria digitar o número "0". 2. Se o usuário digita a letra "l", assumimos que ele queria digitar o número "1". 3. Vírgulas e espaços são permitidos, porém não são processados (são ignorados). Se, mesmo com as regras acima, o usuário não entrou um número não-negativo, imprima a string "error". Overflow (um valor maior que 2147483647) é considerado inválido e "error" deve ser impresso.
Linguagens: C e C++
Solução:
Código em C:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char linha[55], resposta[55], novo[55]; int i, k, j, flag, tamResposta; long long int saida; while (fgets(linha, 55, stdin) != NULL) { flag = 0; tamResposta = 0; for (i = 0, k = 0; i < strlen(linha); i++) { if (linha[i] < 48 || linha[i] > 57 ) { if (linha[i] == 'o' || linha[i] == 'O') { resposta[k] = '0'; k++; } else if (linha[i] == 108) { resposta[k] = '1'; k++; } else if (linha[i] != 44 && linha[i] != 32 && linha[i] != 10) { flag = 1; break; } } else { resposta[k] = linha[i]; k++; } } for (i = 0; resposta[i] == '0'; i++); for (i = 0, j = 0; i < k; i++) { if (resposta[i] > 47 && resposta[i] < 58) { tamResposta++; novo[j] = resposta[i]; j++; } } saida = atoll(novo); if (flag || saida > 2147483647LL || saida < 0 || tamResposta < 1) printf("error\n"); else if (saida == 0) printf("0\n"); else { printf("%lld\n", saida); } memset(resposta, 0, sizeof resposta); memset(novo, 0, sizeof novo); } return 0; }
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int main() { char linha[55], resposta[55], novo[55]; int i, k, j, flag, tamResposta; long long int saida; while (fgets(linha, 55, stdin) != NULL) { flag = 0; tamResposta = 0; for (i = 0, k = 0; i < strlen(linha); i++) { if (linha[i] < 48 || linha[i] > 57 ) { if (linha[i] == 'o' || linha[i] == 'O') resposta[k] = '0'; else if (linha[i] == 108) resposta[k] = '1'; else if (linha[i] != 44 && linha[i] != 32 && linha[i] != 10) { flag = 1; break; } } else resposta[k] = linha[i]; k++; } for (i = 0, j = 0; i < k; i++) { if (resposta[i] > 47 && resposta[i] < 58) { tamResposta++; novo[j] = resposta[i]; j++; } } saida = atoll(novo); if (flag || saida > 2147483647LL || saida < 0 || tamResposta < 1) cout << "error" << endl; else cout << saida << endl; memset(resposta, 0, sizeof resposta); memset(novo, 0, sizeof novo); } return 0; }
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <iostream> #include <string> using namespace std; int main() { string line; while(getline(cin,line)){ int digits = 0; long long max = 2147483647; string number = ""; bool error = false; if(line.length()==0) error = true; else { for(int i=0;i<line.length();i++){ //cout << number << endl; if(line[i]=='O' or line[i]=='o') line[i]='0'; if(line[i]=='l') line[i]='1'; if(line[i]>='0' and line[i]<= '9'){ if(line[i]=='0'){ if(number.length()>0){ number += line[i]; } else{ digits++; } } else{ number += line[i]; digits++; } } else if(line[i]!=' ' and line[i]!=',') error = true; if(error) break; } } if(digits>0 and number.length()==0)number = '0'; if(number.length()>10) error = true; string::size_type sz; long long number_final = atoll(number.c_str()); if(number_final > max) error = true; if(error or digits==0) cout << "error" <<endl; else cout << number_final << endl; } return 0; } |