Pesquisar este blog

Livros Recomendados

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

quarta-feira, 24 de março de 2021

URI (BEECROWD) - 3137 - Páginas de um Livro - Ad-Hoc - C e C++

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:

  1. Ler todo enunciado do problema.
  2. Ler os tópicos do fórum em caso de dúvidas
  3. Preparar arquivos de entrada para teste, considerando as entradas de exemplo do URI, do udebug e outros valores limite;
  4. Preparar o ambiente de desenvolvimento e utilizar os mesmos parâmetros dos compiladores do URI
  5. 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)

Problema3137

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;
}

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