Vamos partir para mais um exercício da plataforma BEECROWD! Aqui trago a solução do exercício 3137, "Páginas de um Livro", em C e C++.
Antes de resolver qualquer algoritmo do URI (BEECROWD agora), recomendamos seguir os seguintes passos:
- Ler todo enunciado do problema.
- Ler os tópicos do fórum em caso de dúvidas
- Preparar arquivos de entrada para teste, considerando as entradas de exemplo do URI, do udebug e outros valores limite;
- Preparar o ambiente de desenvolvimento e utilizar os mesmos parâmetros dos compiladores do URI
- Preparar um código-fonte padrão, já contendo a chamada às bibliotecas padrão, pré-processadores, retorno de função e um comando de escrita com "\n", pois no URI a grande maioria dos problemas exige a quebra de linha final.
Plataforma: URI (BEECROWD)
Problema: 3137
Linguagens: C e C++
Enunciado:
As páginas de um livro são numeradas de 1 até a última página P. Dada a quantidade de páginas de um livro, sua tarefa é informar quantos dígitos foram usados para numerar este livro, da página 1 até a página P.
Solução:
A quantidade de dígitos cresce em proporção logarítmica, logo, é necessário usar a função log10 (log na base 10) para acumular a quantidade de dígitos que cada página contém. Por que log? Todas as páginas de 1 até 9 terão 1 dígito (10^0) + 1, logo 1 dígito. Todas as páginas de 10 a 99 terão 2 dígitos (10¹) + 1, logo 2 dígitos). Lembre-se da regra básica: log10 b = x <-> 10^x = b. Se P for 1000, log 1000 = 3, mas ele tem 4 dígitos. Por isso, adiciona-se 1 em cada resposta.
Código em C:
Em uma estrutura de repetição, basta acumular o valor do log10 de i. Depois, soma-se um. É importante que este valor seja convertido para int, então usa-se (int) para o cast explícito.
#include <stdio.h> #include <math.h> int main() { int n, acum = 0, i; scanf("%i", &n); for (i = 1; i <= n; i++) acum += (int) log10 ((double) i) + 1; printf("%i\n", acum); return 0; }
Código em C++:
Mesma lógica do código em C.
#include <iostream> #include <cmath> using namespace std; int main() { int n, acum = 0, i; cin >> n; for (i = 1; i <= n; i++) acum += (int) log10 ((double) i) + 1; cout << acum << endl; return 0; }