Tarefa:
Criar um algoritmo capaz de adivinhar o número que o usuário pensou, apenas partindo dos seguintes questionamentos para o usuário:
- O número atual é par?
- O número atual é impar?
- O número atual é um?
Fluxo Sugerido:
1. Perguntar ao usuário se o número pensado é par ou ímpar. Após a resposta, se for par, pedir ao usuário que divida o número por 2. Se for ímpar, pedir ao usuário que subtraia 1, e que então divida o resultado por 2.
2. Perguntar então se o novo resultado obtido é par ou ímpar.
3. O procedimento continua com cada novo resultado. Isto é, sistema pergunta se o número resultante é par ou ímpar e, após a resposta, deve pedir para o usuário repetir o procedimento descrito no item 1.
4. O sistema deve parar quando o usuário responder que o número é impar e igual a 1, encerrando as perguntas, e revelar imediatamente o número pensado pelo usuário.
A ideia é vc usar uma pilha e meio que fatorar, não sei se é o melhor termo, o número. Por exemplo, seja n = 10, n pode ser reescrito como n = 10 = 2(1 + 2(2)). Então daria pra vc fazer uma pilha capaz de gerar o resultador para n. Não sei se já viu recursão, mas na verdade ela nada mais é que uma pilha, então daria pra vc usar recursão ou criar a sua própria pilha. O código abaixo fiz por recursão, pois o código para gerar uma pilha é meio longo, recursão seria melhor.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int n;
char resposta[4];
char sim[] = "SIM";
char nao[] = "NAO";
void strUpper(char *str){//converte uma string para maisculo, ajuda na comparacao
int i;
for(i=0;i<strlen(str);i++) str[i] = toupper(str[i]);
}
int adivinha(){
printf("\n-> O numero atual é par? [SIM/NAO]\n");
scanf("%s", resposta);
strUpper(resposta);
if(!strcmp(resposta, sim)){
printf("\n-> ! DIVIDA O NUMERO ATUAL POR 2\n");
return 2*adivinha();
}
else if (!strcmp(resposta, nao)){
printf("\n-> ! O NUMERO NAO EH PAR, LOGO, EH IMPAR\n");
printf("\n-> O numero atual é 1? [SIM/NAO]\n");
scanf("%s", resposta);
strUpper(resposta);
if(!strcmp(resposta, sim)){
return 1;
}else if (!strcmp(resposta, nao)){
printf("\n-> ! SUBTRAIA 1 DO NUMERO ATUAL E DIVIDA O RESULTADO POR 2\n");
return 1 + 2*adivinha();
} else{
printf("\nDigite apenas 'SIM' ou 'NAO'\n");
}
} else{
printf("\nDigite apenas 'SIM' ou 'NAO'\n");
}
}
int main(int argc, char const *argv[]){
printf("\nO numero que pensou foi: %d\n", adivinha());
return 0;
}
Acho que seria isso, espero ter ajudado um pouco...
O algoritmo será:
#include <stdio.h>#include <ctype.h> #include <string.h>int n;char resposta[4];char sim[] = "SIM";char nao[] = "NAO";void strUpper(char *str){//converte uma string para maisculo, ajuda na comparacao int i; for(i=0;i<strlen(str);i++) str[i] = toupper(str[i]);}int adivinha(){ printf("\n-> O numero atual é par? [SIM/NAO]\n"); scanf("%s", resposta); strUpper(resposta); if(!strcmp(resposta, sim)){ printf("\n-> ! DIVIDA O NUMERO ATUAL POR 2\n"); return 2*adivinha(); } else if (!strcmp(resposta, nao)){ printf("\n-> ! O NUMERO NAO EH PAR, LOGO, EH IMPAR\n"); printf("\n-> O numero atual é 1? [SIM/NAO]\n"); scanf("%s", resposta); strUpper(resposta); if(!strcmp(resposta, sim)){ return 1; }else if (!strcmp(resposta, nao)){ printf("\n-> ! SUBTRAIA 1 DO NUMERO ATUAL E DIVIDA O RESULTADO POR 2\n"); return 1 + 2*adivinha(); } else{ printf("\nDigite apenas 'SIM' ou 'NAO'\n"); } } else{ printf("\nDigite apenas 'SIM' ou 'NAO'\n"); } }int main(int argc, char const *argv[]){ printf("\nO numero que pensou foi: %d\n", adivinha()); return 0;}Para escrever sua resposta aqui, entre ou crie uma conta.
Algoritmo e Programação
•UFPI
Compartilhar