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.
Obs.: Executar e Corrigir enviam seu código ao Wandbox, um serviço externo e gratuito de compilação, que o executa com gcc.
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }
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").%3d. Não há entrada."Executar" roda seu código com a entrada acima. "Corrigir" testa com 1 entradas preparadas.
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; }
printf("\n") da quebra de linha dentro do laço interno, haverá uma quebra de linha a cada número mostrado."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }
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.N! = valor". Considere 0! = 1."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }
"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; }
Sem dados"."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }
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."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }
i <= n.* um triângulo retângulo de N linhas. A linha i tem i caracteres *."Executar" roda seu código com a entrada acima. "Corrigir" testa com 3 entradas preparadas.
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; }
*, então o laço interno usa j <= i.Fizz, para múltiplos de 5 mostre Buzz e para múltiplos de 3 e de 5 ao mesmo tempo mostre FizzBuzz."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
#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; }
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."Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
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; }
is_prime, que guarda "se é primo ou não". Usar break assim que encontrar um divisor evita cálculos desnecessários.* 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)."Executar" roda seu código com a entrada acima. "Corrigir" testa com 3 entradas preparadas.
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; }
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
(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; }
a * b / g, a multiplicação transborda com mais facilidade, então divida primeiro."Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
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; }