Escrever um programa que calcule e imprima todos os números entre 1 e 30 que possuam a seguinte característica:8^3=512 e 5+1+2=8. (Resposta: 1, 8, 17, 18, 26, 27). 8^3 (significa 8 elevado a 3) ou (8 elevado ao cubo)

Gostaria de pedir ajuda com esse programa

Como é que 1, 8, 17, 18, 26 e 27 são iguais à 8^3 ou 512 ?

Explica melhor o que você quer fazer.

Eu acho que é assim:
1³ = 1 => 1 = 1
8³ = 512 => 5 + 1 + 2 = 8
17³ = 4913 => 4 + 9 + 1 + 3 = 17

Qual é exatamente a sua dúvida? Você só deve realizar os procedimentos assim e checar se é verdadeiro.

function atividade() {

for (i=0;i<30;i++) {
		var resultado da multiplicaçao cubica de cada numero = i*i*i;
	var resultado da multiplicaçao cubica dividos em um vetor de string por posiçao = cubica.toString().split('');

		var resultadoSomaInt = posiçao 1 do vetor de string + posiçao 2 do vetor de string + posiçao 3 do vetor de string;
		if (resultadoSomaInt == i) {
   			printf(i);
		}
}

}

EXEMPLO:

function atividade() {

for (i=0;i<30;i++) {
		var cubica = i*i*i;
	var somaValores = cubica.toString().split('');

		var resultadoSomaInt = parseInt(somaValores(1), 10) + parseInt(somaValores(2), 10) + parseInt(somaValores(2), 10);

		if (resultadoSomaInt == i) {
   			print(i);
		}
}

}

Em Javascript é assim, mas em C não sei como fazer.

Seria a mesma coisa, exceto que no C não parece ter um método nativo para quebrar a String como em outras linguagens! Não sei muito de C, mas pesquisando conseguir montar esse código:

#include <stdio.h>
#include <string.h> 

int main(void) {
    
    for(int i = 1; i <= 30; i++) {
        
        long num = i * i * i;
        
        char numEmString[50];
        sprintf(numEmString, "%ld", num); // Convertendo para String
        
        int somaDosDigitos = 0;
        int tamanho = strlen(numEmString); // Tamanho da String
        
        // Somando todos os digitos!
        for(int j = 0; j < tamanho; j++) {
            
            int digito = numEmString[j] - '0'; // Convertendo char para Int
            somaDosDigitos += digito;
        }
        
        if(somaDosDigitos == i) {
            printf("%d\n", i);
        }
    }
    
    return 0;
}

Bom, se você tem que testar os números de 1 a 30, faça um for de 1 a 30 :slight_smile:

Depois, para cada número:

  • calcule o número elevado ao cubo
  • some os dígitos do cubo
  • veja se o resultado é igual ao número

Assim:

for (int i = 1; i <= 30; i++) {
    int n = i * i * i; // número ao cubo

    // calcula a soma dos dígitos
    int somaDigitos = 0;
    while (n > 0) {
        somaDigitos += n % 10; // resto da divisão por 10 = último dígito
        n /= 10; // divide por 10, eliminando o último dígito
    }

    if (somaDigitos == i) { // se a soma dos dígitos é igual ao número
        printf("%d\n", i);
    }
}

Veja que para somar os dígitos basta fazer outro loop:

  • pego o último dígito (que é o resto da divisão por 10: n % 10)
  • depois divido o número por 10 (assim o último dígito é eliminado, e na próxima iteração pegarei o penúltimo dígito)
  • e assim por diante, até o número ser zero

Não precisa transformar o número em string, é uma volta desnecessária.

1 curtida

Não precisa converter para string, dá pra fazer só com matemática (veja minha resposta acima) :slight_smile:

1 curtida

Muito obrigada a todos, me ajudou muito!!!