Ir ao conteúdo

C Somar os multiplos, funcao c


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

 Olá, boa tarde. Eu estou tentando fazer uma função c que obrigatoriamente tenha o seguinte protótipo:  

int somaMultip(int t[ ], int size, int limite)

 

A função somaMultip vai encontrar a soma de todos os números entre 1 e limite-1 que são múltiplos de algum número do vetor t de tamanho size.

Se listarmos todos os números naturais abaixo de 20 que são múltiplos de 3 ou 5, obteremos 3, 5, 6, 9, 10, 12, 15 e 18. A soma desses múltiplos é 78.


Na entrada:
Uma quantidade n, seguida de n números inteiros.

Um número limite.

Na saída
a soma de todos os números entre 1 e limite-1 que são múltiplos de algum dos números entrados anteriormente.

Aqui é até onde fui até agora: 
 

#include <stdio.h>

int somaMulti(int t[], int size, int limite) {
    int soma = 0;
	scanf("%d", &size);  
    for(int i = 0; i < size; ++i){
        scanf("%d", t[i]);
        
    scanf("%d", &limite);
    for(int j = 1 ; j <= limite-1 ; j++) {
    	if(v[size]%limite == 0 || v[size+1]%limite == 0) {
            soma += j;
	}
}
}
    printf("%i\n", soma);
	return soma;
}

int main () {
	int size = 0;
	int soma_multiplos(int t[], int size, int limite);
	
	return 0;
}

 

  • Solução
Postado
int somaMulti(int t[], int size, int limite) {
    int soma = 0;
	scanf("%d", &size);  
    for(int i = 0; i < size; ++i){
        scanf("%d", t[i]);
        
    scanf("%d", &limite);
    for(int j = 1 ; j <= limite-1 ; j++) {
    	if(v[size]%limite == 0 || v[size+1]%limite == 0) {
            soma += j;
	}
}

 

Acho que não entendeu ainda o propósito de se escrever uma função e passar argumentos para ela.

Se fosse para ler o vetor de novo toda vez que chamasse a função qual seria a razão de existir o argumento?

 

Acho que já te disse isso antes, mas pergunto de novo: porque não testa o retorno de scanf()? Qual o sentido de seguir com o programa se não ler nada?

 

A função vai calcular a soma dos múltiplos em um vetor que é fornecido, t[]. Essa é a razão de existir a função: ela soma os múltiplos para qualquer vetor.

 

O que está fazendo com a soma? Não deveria retornar a soma para main()? 

 

 

Notou que a função que escreveu tem um nome e a função de chama tem outro? 

 

E o vetor mudou de nome de t[] para v[]?

 

	if(v[size]%limite == 0 || v[size+1]%limite == 0) {
            soma += j;

 

Não entendi essa conta. limite é o maior valor possível. Não é um fator. Os fatores são os elementos do vetor. E podem ser muitos, não apenas 2 como no seu exemplo.

 

E não pode usar OR ou vai somar mais de uma vez se for múltiplo de mais de um elemento do vetor.

 

Escreva isso em um papel antes de programar

 

Pense no simples: todo numero é múltiplo de 1, certo?

 

Isso quer dizer que se tiver 1 no vetor então o resultado será a soma de todos os números até o limite, como está escrito no enunciado. E isso é algo conhecido desde o ensino fundamental. Pode usar isso para testar seu programa

 

 

  • Curtir 1
  • Obrigado 1
Postado
1 hora atrás, Talyson Maia disse:

@arfneto Eu achei essa questão em um site inglês chamado Euler, por isso tava muito confuso. Eu consegui resolver, realmente eu estava errando a forma de introdução da função e também no vetor.

 

Entendo.

 

Faça seu programa trabalhar por você e mostrar as coisas. E use nomes mais significativos.

 

Como já resolveu, vou te mostrar uma outra maneira

 

Escreva em torno dos dados.

 

 

6 horas atrás, arfneto disse:

Isso quer dizer que se tiver 1 no vetor então o resultado será a soma de todos os números até o limite, como está escrito no enunciado. E isso é algo conhecido desde o ensino fundamental. Pode usar isso para testar seu programa

 

 

Isso é uma PA, a popular progressão aritmética, se tiver 1 no vetor.

 

Porque? Porque todo número é múltiplo de 1 :) Então se o limite for 6 vai usar os números 1,2,3,4 e 5. isso soma 15, e se sabe desde o primário que isso é a soma do primeiro com o último, multiplicada pelo tamanho da série e dividida por 2

 

No simples, (1+ 5) * 6 / 2 = 6 * 5 / 2 = 30 / 2 = 15....

 

Se declarar a função

 

    int somaMulti(int fator[], int size, int limite)

 

assim fica mais claro que cada elemento do vetor vai ser testado como um fator de números de 1 até o limite

 

EXEMPLO

 

int somaMulti(int fator[], int size, int limite)
{
    int soma = 0;
    // para os numeros entre 1 e limite-1        
    for(int num = 1 ; num < limite; num++)
    {   // testa se e multiplo de algum numero de t[]
        for ( int ix = 0; ix<size; ix+=1 )
        {   // se 'num' for multiplo soma
        	if( num % fator[ix] == 0)
            {
                printf("%d multiplo de %d\n", num, fator[ix]);
                soma += num;
                break;
            }
        }
	}
    return soma;
}

 

Note o printf() que joga a seu favor... Usando seu exemplo a função mostra
 

3 multiplo de 3
5 multiplo de 5
6 multiplo de 3
9 multiplo de 3
10 multiplo de 5
12 multiplo de 3
15 multiplo de 3
18 multiplo de 3
Soma = 78

 

Deu certo da primeira vez, mas se não desse esse printf() ajudaria a achar o erro. Chame de programação defensiva... Primeiro você coloca os printf(), depois tira. Não coloca depois de dar erro ;) 

 

main() para esse teste

 

int main(void)
{
    printf("Soma = %d\n", somaMulti( (int[]){3,5}, 2, 20 ) );
	return 0;
}

 

Então, uma linha só.

 

Note que em C

  • se você vai criar o vetor só para passar para a função pode criar direto na lista de argumentos
  • se vai só char a função para mostrar o resultado pode chamar direto no printf(). No geral isso não é recomendável, mas para uma coisa tão direta como essa aqui não há razão pra ficar escrevendo muito.

Usando (mais) dados conhecidos

 

    printf("Soma = %d\n", somaMulti( (int[]){1}, 1, 6 ) );

 

Esse é o outro exemplo....

 

1 multiplo de 1
2 multiplo de 1
3 multiplo de 1
4 multiplo de 1
5 multiplo de 1
Soma = 15

 

 

 

 

  • Obrigado 1
Postado
3 horas atrás, Talyson Maia disse:

@arfneto nesse printf teste, caso eu não queira testar, mas sim chamar os numeros para digitar, eu coloco um scanf ao invés desses números?

 

Não, não faz sentido. Para que a função recebe o vetor então?

 

Se vai ler os valores vai ler claro antes de chamar a função. Para isso servem os argumentos

Postado

@Talyson Maia

Em 31/08/2021 às 13:10, Talyson Maia disse:

@arfneto nesse printf teste, caso eu não queira testar, mas sim chamar os numeros para digitar, eu coloco um scanf ao invés desses números?

To com uma questão muito parecida pra fazer até amanhã 00:00 pode me passar esse site com a questão ? 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!