Exercícios de repetição (laços for e while) em C

Reunimos 13 exercícios, do iniciante ao avançado, que usam laços for e while. Escreva seu código no navegador e clique em "Corrigir": ele é executado com gcc de verdade em várias entradas e a saída é verificada.

Como usar estes exercícios
  1. Leia o enunciado e o exemplo de execução e escreva seu código no campo abaixo
  2. Clique em "▶ Executar" para testar com a sua própria entrada
  3. Clique em "✔ Corrigir" para verificar a saída com várias entradas preparadas
  4. Travou? Abra a "Dica". Resolveu? Compare com "Solução e explicação"
Regras da correção
  • Imprima a saída exatamente como no exemplo. Não imprima mensagens pedindo a entrada, como "Digite um número"
  • Espaços no fim das linhas e linhas em branco no final são ignorados
  • Seu código é salvo automaticamente neste navegador

Obs.: Executar e Corrigir enviam seu código ao Wandbox, um serviço externo e gratuito de compilação, que o executa com gcc.

13 exercícios (Iniciante 4 · Intermediário 5 · Avançado 4)

Laços for e while (13 exercícios)

L01 Iniciante

Exercício 1. Soma de 1 até N

Leia um inteiro N (1 ≤ N ≤ 1000) e mostre a soma de 1 até N.
Exemplo de execução (a entrada está sublinhada)
10 Soma: 55
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Inicialize com 0 a variável sum, que guarda a soma, e depois repita sum += i; com for (i = 1; i <= n; i++).
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    printf("Soma: %d\n", sum);
    return 0;
}
Explicação: Há dois erros comuns. Se você esquecer de inicializar sum, a soma começa a partir de um valor indeterminado. Se a condição for i < n, N não é somado (falta um: o erro "off-by-one").
L02 Iniciante

Exercício 2. Tabuada

Mostre a tabuada do 1 ao 9. Cada tabuada ocupa uma linha, e os números devem ser alinhados com largura 3 usando %3d. Não há entrada.
Exemplo de execução
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 1 entradas preparadas.
Use um laço for aninhado (um dentro do outro). O laço externo é a "tabuada" (linha) e o laço interno é o "multiplicador" (coluna). Quando o laço interno terminar, quebre a linha com printf("\n");.
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            printf("%3d", i * j);
        }
        printf("\n");
    }
    return 0;
}
Explicação: Em laços aninhados, o externo avança 1 passo cada vez que o interno completa uma volta inteira. Se você colocar o printf("\n") da quebra de linha dentro do laço interno, haverá uma quebra de linha a cada número mostrado.
L03 Iniciante

Exercício 3. Números pares até N

Leia um inteiro N (1 ≤ N ≤ 100) e mostre em uma linha, em ordem crescente e separados por espaço, os números pares de 2 até N. Se não houver nenhum, mostre uma linha vazia.
Exemplo de execução (a entrada está sublinhada)
10 2 4 6 8 10
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Começando i em 2 e aumentando com i += 2, você pega só os pares, em ordem. Também dá para resolver testando i % 2 == 0.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 2; i <= n; i += 2) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
Explicação: A terceira parte do for (a expressão de atualização) não precisa ser i++; você pode escrever livremente, como i += 2. Esta correção ignora espaços no fim da linha, então a resposta está certa mesmo que "%d " deixe um espaço no final.
L04 Iniciante

Exercício 4. Fatorial

Leia um inteiro N (0 ≤ N ≤ 20) e mostre o fatorial de N, N!, no formato "N! = valor". Considere 0! = 1.
Exemplo de execução (a entrada está sublinhada)
5 5! = 120
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
A variável que acumula as multiplicações deve ser inicializada com 1. 20! não cabe em um int (o limite é cerca de 2,1 bilhões), então use o tipo long long e o formato %lld.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    long long fact = 1;
    for (int i = 1; i <= n; i++) {
        fact *= i;
    }
    printf("%d! = %lld\n", n, fact);
    return 0;
}
Explicação: O valor inicial de uma soma é 0, e o valor inicial de um produto é 1. Calculando com int, a partir de 13! o valor transborda (overflow) e fica estranho. O teste com N=20 verifica isso.
L05 Intermediário

Exercício 5. Soma dos dígitos

Leia um inteiro N não negativo (0 ≤ N ≤ 2000000000) e mostre a soma de seus dígitos.
Exemplo de execução (a entrada está sublinhada)
12345 Soma dos dígitos: 15
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
n % 10 extrai o algarismo das unidades e n / 10 descarta o algarismo das unidades. Repita isso com um while até n chegar a 0.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    printf("Soma dos dígitos: %d\n", sum);
    return 0;
}
Explicação: Para repetições cujo número de vezes não é conhecido de antemão, o while é o mais adequado. "Extrair o algarismo das unidades → descartá-lo" é o padrão clássico dos problemas com dígitos; vale a pena memorizar, pois serve para muitos outros casos.
L06 Intermediário

Exercício 6. Somar até ler 0

Leia inteiros um após o outro e, quando for lido 0, pare e mostre a quantidade, a soma e a média dos números lidos até então (sem contar o 0). A média deve ser mostrada com duas casas decimais. Se nenhum número for lido antes do 0, mostre "Sem dados".
Exemplo de execução (a entrada está sublinhada)
3 5 7 0 Quantidade: 3 Soma: 15 Média: 5.00
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Faça um laço infinito com while (1) e saia com break quando o valor lido for 0. Para a média, divida convertendo um dos lados para double, como em (double)sum / count.
#include <stdio.h>

int main(void) {
    int x, count = 0, sum = 0;

    while (1) {
        scanf("%d", &x);
        if (x == 0) break;
        count++;
        sum += x;
    }

    if (count == 0) {
        printf("Sem dados\n");
    } else {
        printf("Quantidade: %d\n", count);
        printf("Soma: %d\n", sum);
        printf("Média: %.2f\n", (double)sum / count);
    }
    return 0;
}
Explicação: Escrevendo sum / count, a operação vira uma divisão entre inteiros e a parte decimal é descartada. Além disso, esse valor int seria passado para %.2f, e o que aparece na tela é lixo (comportamento indefinido; em alguns ambientes aparece 0.00). O compilador também mostra um aviso, então leia sempre os avisos. E, como dividir com count ainda em 0 seria uma divisão por zero, esse caso é tratado antes, separadamente.
L07 Intermediário

Exercício 7. Listar os divisores

Leia um inteiro N (1 ≤ N ≤ 10000) e mostre os divisores de N em uma linha, em ordem crescente e separados por espaço. Na linha seguinte, mostre a quantidade de divisores.
Exemplo de execução (a entrada está sublinhada)
12 1 2 3 4 6 12 Número de divisores: 6
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Para cada i de 1 a N, se n % i == 0 (divisão exata), i é divisor. Conte a quantidade ao mesmo tempo em que mostra.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int count = 0;
    for (int i = 1; i <= n; i++) {
        if (n % i == 0) {
            printf("%d ", i);
            count++;
        }
    }
    printf("\nNúmero de divisores: %d\n", count);
    return 0;
}
Explicação: É o padrão de colocar um if dentro do laço para processar só o que satisfaz a condição. Como o próprio N também é divisor, a condição deve ser i <= n.
L08 Intermediário

Exercício 8. Desenhar um triângulo retângulo

Leia um inteiro N (1 ≤ N ≤ 20) e desenhe com * um triângulo retângulo de N linhas. A linha i tem i caracteres *.
Exemplo de execução (a entrada está sublinhada)
4 * ** *** ****
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 3 entradas preparadas.
O laço externo percorre as linhas i de 1 a N, e o laço interno mostra i caracteres *. O ponto-chave é que a condição de término do laço interno depende da variável i do laço externo.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
Explicação: O truque nos problemas de desenhar figuras é escrever como fórmula "o que e quantos caracteres mostrar na linha i". Aqui são i caracteres *, então o laço interno usa j <= i.
L09 Intermediário

Exercício 9. FizzBuzz

Leia um inteiro N (1 ≤ N ≤ 100) e mostre os números de 1 até N, um por linha. Porém, para múltiplos de 3 mostre Fizz, para múltiplos de 5 mostre Buzz e para múltiplos de 3 e de 5 ao mesmo tempo mostre FizzBuzz.
Exemplo de execução (a entrada está sublinhada)
15 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
A ordem dos testes é importante. Primeiro verifique "é múltiplo de 15 (de 3 e de 5)?", depois 3 e depois 5, usando if … else if.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        if (i % 15 == 0) {
            printf("FizzBuzz\n");
        } else if (i % 3 == 0) {
            printf("Fizz\n");
        } else if (i % 5 == 0) {
            printf("Buzz\n");
        } else {
            printf("%d\n", i);
        }
    }
    return 0;
}
Explicação: Se você testar i % 3 == 0 primeiro, no 15 o programa para em "Fizz" e FizzBuzz nunca aparece. Quando as condições se sobrepõem, escreva primeiro a condição mais restrita.
L10 Avançado

Exercício 10. Mostrar todos os primos até N

Leia um inteiro N (1 ≤ N ≤ 10000) e mostre em uma linha, em ordem crescente e separados por espaço, os números primos menores ou iguais a N. Na linha seguinte, mostre a quantidade de primos (quando N for 1, mostre uma linha vazia e "Quantidade de primos: 0").
Exemplo de execução (a entrada está sublinhada)
20 2 3 5 7 11 13 17 19 Quantidade de primos: 8
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
O laço externo percorre os candidatos k de 2 a N, e o laço interno verifica "se k é divisível por algum número de 2 até √k". Usando j * j <= k como condição, não é preciso usar √.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int count = 0;
    for (int k = 2; k <= n; k++) {
        int is_prime = 1;
        for (int j = 2; j * j <= k; j++) {
            if (k % j == 0) {
                is_prime = 0;
                break;
            }
        }
        if (is_prime) {
            printf("%d ", k);
            count++;
        }
    }
    printf("\nQuantidade de primos: %d\n", count);
    return 0;
}
Explicação: Não esqueça de voltar para 1, a cada candidato, a variável sinalizadora (flag) is_prime, que guarda "se é primo ou não". Usar break assim que encontrar um divisor evita cálculos desnecessários.
L11 Avançado

Exercício 11. Desenhar uma pirâmide

Leia um inteiro N (1 ≤ N ≤ 20) e desenhe com * uma pirâmide de N linhas. A linha i tem N−i espaços seguidos de 2i−1 caracteres * (sem espaços no fim da linha).
Exemplo de execução (a entrada está sublinhada)
4 * *** ***** *******
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 3 entradas preparadas.
Dentro de cada linha, coloque dois laços internos em sequência. O primeiro mostra n - i espaços, o segundo mostra 2 * i - 1 caracteres *, e no final quebre a linha.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < n - i; j++) {
            printf(" ");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
Explicação: Fazendo uma tabela das quantidades por linha, a fórmula aparece (para N=4: espaços 3,2,1,0 e asteriscos 1,3,5,7). Os espaços no início da linha são comparados na correção, então se a quantidade estiver errada a resposta é considerada incorreta.
L12 Avançado

Exercício 12. MDC e MMC

Leia dois inteiros positivos a e b (1 ≤ a, b ≤ 100000) separados por espaço e mostre o máximo divisor comum (MDC) e o mínimo múltiplo comum (MMC). Use o algoritmo de Euclides.
Exemplo de execução (a entrada está sublinhada)
12 18 MDC: 6 MMC: 36
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
O algoritmo de Euclides é só "substituir (a, b) por (b, a % b) até b virar 0". O a nesse momento é o MDC. O MMC é a / g * b (g é o MDC). Como o resultado pode não caber em um int, calcule (long long)a / g * b e mostre com %lld.
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);

    int x = a, y = b;
    while (y != 0) {
        int r = x % y;
        x = y;
        y = r;
    }
    int g = x;
    long long l = (long long)a / g * b;

    printf("MDC: %d\n", g);
    printf("MMC: %lld\n", l);
    return 0;
}
Explicação: Os valores originais de a e b são usados no cálculo do MMC, por isso o algoritmo de Euclides roda sobre cópias (x, y). O MMC pode chegar a cerca de 10 bilhões e não cabe em um int, então é calculado em long long. Na ordem a * b / g, a multiplicação transborda com mais facilidade, então divida primeiro.
L13 Avançado

Exercício 13. Conjectura de Collatz

Começando de um inteiro positivo N (1 ≤ N ≤ 100000), repita "se for par, divida por 2; se for ímpar, multiplique por 3 e some 1" até N virar 1. Mostre o número de operações até chegar a 1 e o maior valor que apareceu no caminho (incluindo o próprio N).
Exemplo de execução (a entrada está sublinhada)
6 Passos: 8 Maior valor: 16
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Repita com while (n != 1), fazendo steps++ e atualizando o maior valor a cada volta. Os valores intermediários podem chegar a centenas de vezes N, então é mais seguro usar long long.
#include <stdio.h>

int main(void) {
    long long n;
    scanf("%lld", &n);

    int steps = 0;
    long long max = n;
    while (n != 1) {
        if (n % 2 == 0) {
            n /= 2;
        } else {
            n = 3 * n + 1;
        }
        steps++;
        if (n > max) max = n;
    }
    printf("Passos: %d\n", steps);
    printf("Maior valor: %lld\n", max);
    return 0;
}
Explicação: É um problema típico de while em que não se sabe quantas repetições haverá. Se o valor inicial do máximo não for o próprio N, o maior valor não sai correto quando N=1. Os valores intermediários ficam muito maiores que N (com N=77031 chegam a cerca de 21,93 milhões, e com N ainda maior ultrapassam o limite do int).

Revise estas aulas

← Voltar para todos os exercícios