Vector mean of prime number indices

Asked

Viewed 255 times

1

Well, this is the problem. I thought here and arrived at a code. However, both the sum and the k (which would be the prime number positions) are incorrect. Any idea why?

#include <stdio.h>
#include <windows.h>
int main(void)
{
    int k,i,j,d,v[101],soma,prim,f;
    float med;
    i=0;
    while((i<101) && (j!=0) ){
        i++;
        printf ("Defina o valor do elemento %d => ", i);
        scanf ("%d", &v[i]);
        printf ("Para parar digite 0 => ");
        scanf ("%d", &j);
    }
    k=0;
    prim=1;
    f=i;
    soma=0;
    while (f>2){ // verificação para ver se a posição do vetor(i) é um número primo
        if (i%(f-1)==0){
            prim = 0;
        }
        else{
            k++;
            soma=soma+v[f];
        }
        f=f-1;
    }
    med=soma/k;
    printf("%d, %d, %d", k,soma,i); // só está servindo pra ver o que está dando errado no código
    printf("A media e => %f \n", med);
    system("pause");
}
  • what good is prim = 0;?

  • 1

    The problem is in the way you are checking if a number is prime. From what I quickly understood of its algorithm, inside its while loop i is fixed (always with 101, for example). And you do 101% (100), then 101%(99), 101%(98) and so on, comparing if the result of this mod is 0. You’re not testing if a number of your vector is prime. One of the simplest (but inefficient) ways to check if a number is prime is to loop to the number in question by checking if it has 2 divisors, if it has prime.

1 answer

1

This excerpt from your code has some problems:

k=0;
prim=1;
// o valor armazenado nunca é comparado com nada nem impresso.
// Em um ponto mais pra baixo, você altera esse valor, mas continua não usando pra nada.
f=i;
soma=0;
while (f>2){
    if (i%(f-1)==0){
    // i armazena o tamanho do seu vetor, você está checando se isso é divisível por f.
    // O que você deveria estar checando é se f, a posição atual, é um número primo. 
        prim = 0;
    }
    else{
    // esta parte parece certa, exceto que você vai entrar aqui quando o tamanho
    // do seu vetor é divisível pela posição atual.
        k++;
        soma=soma+v[f];
    }
    f=f-1;
}

If you change that parole to something that checks if f is cousin, it will probably work as you wanted.

But given that you have a fixed size and small vector, there is a more efficient way to solve your problem. The following pseudocode would be more efficient:

P := (2, 3, ..., 97) # P armazena todos os primos entre 0 e 100
m := len(P)          # m armazena a quantidade de números primos no intervalo
I := input           # I armazena os valores que o usuário digitou
n := len(I)          # n armazena o número de elementos no vetor I
k := 0               # k recebe a quantidade de índices primos
s := 0               # s recebe a soma dos valores em índices primos

enquanto i < m e P[i] < n:
# para cada número primo que também é um índice válido de I:
        k += 1    # atualiza k
        s += P[i] # atualiza s
        i += 1    # atualiza i

Browser other questions tagged

You are not signed in. Login or sign up in order to post.