Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, preciso de um programa em c que calcule e apresente os n primeiros numeros de fibonacci que sejam primos, fiz o código que apresenta os n primeiros números de fibonacci,só não sei como faço para mostrar só os primos.

#include<stdio.h>
#include<conio.h>

double fibonacci (int n)
{
    int a=1,b=1,x,i;
    if(n==1) x=a;
    if(n==2) x=b;
    for(i=3;i<=n;i++){
    x=a+b;
    a=b;
    b=x;
}
    return x;

int main()
{
    int x,n;
    printf("\nDigite n-esimo termo: ");
    scanf("%d",&n);
    x=fibonacci(n);
    printf("\n\n%d\n",x);
    system ("pause");
    return 0;
}

 

 

  • Curtir 1
Postado

Tem que adicionar um novo loop testando se é primo. Pra saber se é primo, tem que testar o resto da divisão do número pelos n inteiros de 1 até o número. Se for primo, os únicos restos de divisão que vão ser zero são quando n=1 e n=número, aí manda pra um novo vetor; se alguma outra divisão tiver resto zero, descarta o número (não é primo).

  • Curtir 1
Postado
agora, jeanzin001 disse:

@Shaman93 cara você consegue adicionar esses termos no meu programa se não for pedir demais, estou iniciando em C e estou um pouco perdido em algumas coisas.

Isso seria fazer o trabalho pra você... Já te dei toda a lógica, cabe a você transformar em código. Senão vai continuar perdido, tem que quebrar um pouco a cabeça pra aprender a programar. Tenta fazer aí, se não funcionar ou der problema a gente ajuda.

  • Curtir 2
Postado

Refiz o código inteiro e coloquei para mostrar os primos apenas, mas ta dando errado,mostra os numeros primos, mas coloquei para mostrar uma sequencia com seis numeros de fibonacci, era pra me retornar 1,1,2,3,5,8 mas está me retornando 1,1,1,2,2,3,3,5,5,8,8,13,13 e mostrando o 01 como primo.


#include "stdio.h"
 

void main()
{

  int a, b, auxiliar, i, n, primo, k;
 

  a = 0;
  b = 1;
 
  
  printf("Digite um número: ");

  scanf("%d", &n);
  printf("Série de Fibonacci:\n");
  printf("%d\n", b);
 
  
  for(i = 0; i < n; i++)
  {
    auxiliar = a + b;
    a = b;
    b = auxiliar;

    primo=0;
        for(k=1; k<=auxiliar; k++)
            if((auxiliar%k)==0)
                 primo++;
        if(primo>2)
            printf("%d nao e primo\n", auxiliar);

        else
            printf("%d e primo\n", auxiliar);
    
 
    
    printf("%d\n", auxiliar);
  }
}

 

  • Curtir 1
Postado
1 hora atrás, jeanzin001 disse:

Refiz o código inteiro e coloquei para mostrar os primos apenas, mas ta dando errado,mostra os numeros primos, mas coloquei para mostrar uma sequencia com seis numeros de fibonacci, era pra me retornar 1,1,2,3,5,8 mas está me retornando 1,1,1,2,2,3,3,5,5,8,8,13,13 e mostrando o 01 como primo.

Pra tirar o 1 basta começar a contagem a partir de 2. Tem formas mais elegantes, mas essa é a mais simples. Pelo que entendi do exercício, não precisa escrever 'é primo' ou 'não é primo', basta imprimir apenas os primos. Ou seja, depois do teste, basta imprimir se for primo. Se não for, ele não vai imprimir e vai voltar pro início do loop, não precisa nem usar else. Inclusive está imprimindo 2 vezes porque uma vez imprime com 'é primo' ou 'não é primo' e a outra vez imprime no final, só o número.

Ah, boa estratégia, dividir pra conquistar. Se você precisa mostrar os fibonacci primos, é lógico que precisa de um algoritmo que mostre fibonacci, outro que mostre os primos e alguma forma de fazer eles conversarem. Parabéns.

  • Curtir 1
Postado

@Shaman93 Vou tentar refazer, qualquer coisa volto a entrar em contato.

adicionado 27 minutos depois

Peço desculpas por incomodar, mas não estou conseguindo de maneira alguma fazer o programa, cada vez um erro novo.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>

main() {

    setlocale(LC_ALL, "Portuguese");

    int a, b, auxiliar, i, n;
    int div = 0;

    a = 0;
    b = 1;

    printf("Digite um número: ");
    scanf("%d", &n);
    printf("\nSérie de Fibonacci:\n\n");
    printf("%d\n", b);

    for(i = 0; i < n; i++) 

        auxiliar = a + b;
        a = b;
        b = auxiliar;

        
        
         scanf("%d", &auxiliar);
   while (auxiliar <= 0);
  
  for (i = 1; i <= auxiliar; i++) 
    if (auxiliar % i == 0) 
     div++;
    
	
  if (div == 2)
    printf("O número %d é primo!", auxiliar);
  else
    printf("O número %d não é primo!", auxiliar);

  return 0;
}

    

 

Postado

Você escreveu

double fibonacci (int n)
{
    int a=1,b=1,x,i;
    if(n==1) x=a;
    if(n==2) x=b;
    for(i=3;i<=n;i++)
    {
    x=a+b;
    a=b;
    b=x;
    }
    return x;
}                     

Mas não faz muito sentido:  essa é uma sequência de números inteiros positivos. Porque não escrever 

int fibonacci (int N);

Que retorna um int ao invés de double?.

 

E se escreveu essa porque não escreve essa:

int primo(int N);

 

Que retorna digamos 1 se o N é primo?

 

E aí usa as duas juntas?

 

Pensando um pouco mais, entenda que a cada vez que vai chamar a função ela faz todas as contas desde o início, Não é muito esperto, já que vai repetir TODAS as contas, e o final é conhecido, certo? Afinal é uma sequência e vai retornar a soma dos dois últimos... Essa é a única memória da sequência de Fibonacci.

 

Sabe o que isso quer dizer? Que a sequência de Fibonacci tem memória curta: 2 números

 

Eis o início

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

A sua função a cada vez vai somar todo mundo a toa.

 

E ai?

 

Entenda que se você tem uma função que retorna o próximo Fibonacci e uma função que mostra se um número é primo

e precisa dos N primeiros primos da sequência de Fibonacci basta um loop de 1 a N onde você pega o próximo na sequência de Fibonacci e se ele for primo você mostra e incrementa esse número de primos até N...

  • Curtir 1
Postado

Estou começando a entender, porém ainda tenho erros, segue dados

#include <stdio.h>
#include <stdlib.h>

main(int ac, char *av[])
{
   int *vet,i,a;

   if(ac!=2) 
   { printf("número inválido de argumentos"); exit(1); }

   vet=calloc(atof(av[1]),sizeof(int);

   vet[0]=vet[1]=1;
   printf("%d,%d",vet[0],vet[1]);
   for(i=2;i<atof(av[1]);i++) {
      vet[i]=vet[i-1]+vet[i-2];
      if(primo(vet[i])) printf(",%d",vet[i]);
   }
   printf("\n");
}

int primo (int a) {
   int i,k=0;
   for(i=1;i<=a;i++) {
      if(a%i==0) k++;
   }
   if(k==2) return 1;
   else return 0;
}

image.thumb.png.aa38a1b310a6846b413a3e2550faebfc.png

image.png

  • Curtir 1
Postado

porque insiste em float/double para números inteiros? atof() converte para float.

 

Tanto Fibonacci quanto primo() esperam inteiros.

 

Se dois fatores geram o produto N então enquanto um aumenta o outro diminui. No maior caso um é igual ao outro, como 9 = 3x3. Mas 10 pode ser 2x5 ou 5x2. Enquanto um aumenta o outro diminui.

Isto quer dizer que não precisa testar além da raiz quadrado do número. Pense nisso.

 

O que falta em seu programa é explicar ao compilador o que é primo()... 

 

Você chama primo() na linha 17 mas só define na 22.

 

No início de main() você deve antecipar isso, declarando

    int primo(int);

Isso se chama protótipo e é o suficiente para o compilador saber o que fazer com a linha 17...

 

 

 

 

  • Curtir 2
Postado

@Simon Viegas Pessoal, fiz algumas alterações no programa, porém ainda não roda, está com erro na linha 11 e 22, vocês tem mais alguma dica ?

 

#include <stdio.h>
#include <stdlib.h>

main(int ac, char *av[])
{
   int *vet,i;
   int primo (int);

   if(ac!=2) { printf("número inválido de argumentos"); exit(1); }

   vet=calloc(atof(av[1]),sizeof(int)")" ;

   vet[0]=vet[1]=1;
   printf("%d,%d",vet[0],vet[1]);
   for(i=2;i<atof(av[1]);i++) {
      vet[i]=vet[i-1]+vet[i-2];
      if(primo(vet[i])) printf(",%d",vet[i]);
   }
   printf("\n");
}

 {
   int i,k=0;
   for(i=1;i<=a;i++) {
      if(a%i==0) k++;
   }
   if(k==2) return 1;
   else return 0;
}

image.thumb.png.3c7a84b0804e0a4701df94ae236a9ad9.png

  • Curtir 1
Postado

Você leu o que eu escrevi?

 

Porque insiste ainda em atof() se seus dados são int?

 

voce declarou o protótipo dentro da função... está errado 

 

 E deve seguir os parenteses na chamada ERRADA a atof().... Que pretende com aquelas aspas? 

 

Qual o propósito de mudar algo tão estabelecido quanto argc para argument count e argv para argument values? Só vai atrapalhar outros que possam ler seu programa. Qual o benefício? ac é mais legível que argc?

 

image.png.31bb1521f12d2c9ab04b3c1a92072fce.png

  • Curtir 1
Postado

Você já escreveu uma função 

double fibonacci (int n);

e talvez tenha entendido que essa é uma sequência de inteiros positivos então não faz sentido retornar double. Nunca vai aparecer algo tipo 3,4555 certo?

 

E está testando uma função 

int primo(int n);

que imagino deva retornar 0 quando 'n' não é primo. 

 

E o que precisa é dos N primeiros primos na sequência de Fibonacci.

 

Isso seria um simples loop. Então pense no programa abaixo

main(int argc, char* argv)
{
    int N = 12; // esse é o valor que iria ler
    int fa = 1;
    int fb = 1;
    int F = 0; // o proximo Fibonacci
    for (int i = 0; i < N; i += 1)
    {
        F = fa + fb;
        fa = fb;
        fb = F;
        printf("%9d  ", F);
        if (i % 5 == 0) printf("\n");
        if (F > 900* 1000 *1000 ) break; // poe um limite qualquer
    };  // for()
    return 0;
};  // main()

Ele mostra 

        2          3          5          8         13
       21         34         55         89        144
      233        377
          

Sim, os primeiros 12 números na sequência.
 

Agora se a sua função primo(n) funciona você pode apenas mudar umas linhas e escrever

#include <stdio.h>
int primo(int);

main(int argc, char* argv)
{
    int N = 12; // esse é o valor que iria ler
    int fa = 1;
    int fb = 1;
    int F = 0; // o proximo Fibonacci
    for (int i = 0; i < N;)
    {
        F = fa + fb;
        fa = fb;
        fb = F;
        if (primo(F))
        {   // apenas se F e primo
            printf("%9d  ", F); // imprime
            i = i + 1; // avanca no loop
        };  // if()
        if (i % 5 == 0) printf("\n"); // pula linha na tela
        if (F > 900* 1000 *1000 ) break; // poe um limite qualquer
    };  // for()
    return 0;
};  // main()

int primo(int a)
{
    return 1;
};

E já vai funcionar. Talvez você tenha complicado um pouco as coisas.

 

Porque funciona?

 

Você precisa dos N primeiros PRIMOS da sequência de Fibonacci, então num loop até achar N números você só incrementa a variável do loop for se o número da sequência de Fibonacci que vem sendo produzido no loop for primo.

 

 

  • Curtir 2
Postado

@arfneto Rodei seu programa, desde já agradeço pela ajuda, mas existe alguns erros no seu programa mostrando por exemplo o 8 como primo e pulando alguns primos, irei tentar dar uma modificada, obrigado mesmo pelas dicas.

adicionado 5 minutos depois

Até consegui fazer um programa rodar hoje, mas tem alguns erros também, mostra o 1 como impar e pula alguns primos da sequencia.

#include "stdio.h"
 

int main()
{

  int a, b, auxiliar, i, n, primo, k;
 

  a = 0;
  b = 1;
 
  
  printf("Digite um número: ");

  scanf("%d", &n);
  printf("Série de Fibonacci:\n");
   printf("%d\n", b);
 
  
  for(i = 0; i < n; i++)
  {
    auxiliar = a + b;
    a = b;
    b = auxiliar;

    primo=0;
        for(k=1; k<=auxiliar; k++)
            if((auxiliar%k)==0)
                 primo++;
        if(primo>2)
            printf("%d nao e primo\n", auxiliar);

        else
            printf("%d e primo\n", auxiliar);
    
 
    
   
  }
}

 

  • Curtir 1
Postado
9 minutos atrás, Tubarãogigante disse:

Rodei seu programa, desde já agradeço pela ajuda, mas existe alguns erros no seu programa mostrando por exemplo o 8 como primo

 

Você não entendeu. Não tem nenhum erro no que eu escrevi

 

image.png.6ba75540824f408aae3c0bcfc1b26c42.png

Tentou ler o programa? Esse aí acima é o código para primo() e retorna 1 para QUALQUER NÚMERO. Está claro aí.

 

Um em C é verdadeiro, como eu também expliquei. Então para essa função qualquer número é primo.

 

Estou te mostrando como rapidamente resolver seu problema e juntar os 3 elementos que precisa juntar.

 

N elementos, sequência de Fibonacci e a identificação de um primo.

 

Se quer uma função primo() também, pronta, eu postei aqui mesmo, meses atrás, um programa completo que calcula primos através do método tradicional e também usando o crivo de eratóstenes que a gente vê no ensino fundamental. E o programa ainda comparava as duas listas. Pode pesquisar aqui mesmo no contéudo do forum e ter o programa completo.

 

Quanto ao seu programa:

 

Não consegui entender o que está tentando fazer. Porque abandonou a função Fibonacci que havia escrito? E a função primo()?

 

Assim está longe de funcionar.

 

  • Curtir 3
Postado

Ao utilizar fibonacci, recomendo usar uma array para guardar todos os fibonaccis possiveis, a partir disso há um overflow para uint64.

#define FIB_MAX (94)

static unsigned long long fib[FIB_MAX] = { };
static void fill_fib()
{
    fib[0] = 0;
    fib[1] = 1;
    for (unsigned long long i = 2; i < FIB_MAX; i++)
        fib[i] = fib[i - 1] + fib[i - 2];
}

 

E para ver se um numero é primo use:

 

bool eh_primo(unsigned long long n)
{
    if (n <= 1) 
        return false; 
    if (n <= 3)
        return true; 
    if (n % 2 == 0 || n % 3 == 0) 
        return false; 
  
    for (int i = 5; i * i <= n; i += 6) 
        if (n % i == 0 || n % (i + 2) == 0) 
           return false;

    return true; 
}

 

O resultado da combinação das 2 funções:

 

$ time ./fib 
2
3
5
13
89
233
1597
28657
514229
433494437
2971215073
806515533049393
99194853094755497

real    0m0,002s
user    0m0,002s
sys     0m0,000s

 

  • Curtir 2
  • Membro VIP
Postado
10 horas atrás, Matheus Maldi disse:

Ao utilizar fibonacci, recomendo usar uma array para guardar todos os fibonaccis possiveis, a partir disso há um overflow para uint64.

 

Acho a utilização de array desnecessária... no caso, seria preferível ir verificando se é primo ou não a medida que vai gerando um novo número da sequência. Desta forma, irá apenas gerar uma quantidade de números necessários. Utilizando vetores teria que "adivinhar" quantos números são necessários, afinal, não se sabe a relação entre a sequência e a ocorrência de primos. Ou como no teu exemplo, colocar uma "quantidade alta" de números... (obs.: que te antemão não sabia se ia funcionar)

 

  • Curtir 3
  • Membro VIP
Postado

@Tubarãogigante, tentei dar uma reformulada no código do @arfneto.

 

#include <stdio.h>

int primo(int);

int main()
{
    int qtdDesejadaDePrimos = 10;
    int qtdPrimosEncontrados = 0;
    int fa = 0;
    int fb = 1;
    int soma;

    if (primo(fa))
    {
        qtdPrimosEncontrados++;
        printf("%2d  ", fa);
    }; // if()

    for (qtdPrimosEncontrados = qtdPrimosEncontrados; qtdPrimosEncontrados < qtdDesejadaDePrimos;)
    {
        if (primo(fb))
        {
            printf("%2d  ", fb);
            qtdPrimosEncontrados++;
        };  // if()

        if (fb > 900* 1000 *1000 ) break;

        soma = fa + fb;
        fa = fb;
        fb = soma;
    }; // for()

    return 0;
}; // main()

int primo(int a)
{
    //em construção
    return 1;
};

 

Então, tanto esse código, tanto o do @arfneto são apenas um "esboço" (quase tudo na verdade) do que precisa ser feito. Só falta apenas implementar a função primo(). Você pode colocar qualquer algoritmo ali dentro!!! O importante é que, ao receber um inteiro, ele retorne 1 quando esse inteiro é primo, ou 0 quando ele não é primo. Se quiser usar como retorno bool, apenas faça retornar true e false respectivamente... vai dar na mesma!

 

 

Sobre o teu código:

 

11 horas atrás, Tubarãogigante disse:

#include "stdio.h"
 

int main()
{
  int a, b, auxiliar, i, n, primo, k;
 
  a = 0;
  b = 1;

  printf("Digite um número: ");

  scanf("%d", &n);
  printf("Série de Fibonacci:\n");
  printf("%d\n", b);
 
  for(i = 0; i < n; i++)
  {
    auxiliar = a + b;
    a = b;
    b = auxiliar;

    primo=0;
        for(k=1; k<=auxiliar; k++)
            if((auxiliar%k)==0)
                 primo++;
        if(primo>2)
            printf("%d nao e primo\n", auxiliar);

        else
            printf("%d e primo\n", auxiliar);
  }
}

 

  1. Não ser primo não tem algo a ver com o problema. Só importa o que é primo (a não ser que use para ter alguma referência);
  2. Como você quer encontrar 10 primos dentre os números passados (que no caso são da Sequência de Fibonacci), você precisaria utiliza um "contador de primos", ou seja: o laço de repetição deve ficar até encontrar 10 primos, e não até verificar 10 números. O código do @arfneto (e o meu por consequência) já faz isso. Só entender e ajustar o teu código.

 

RESUMINDO:

Já existem 3 soluções possíveis:

  1. A do @arfneto, que basta finalizar a implementação da função primo(); (que foi deixado para você fazer...)
  2. Meu código, que foi baseado no código do @arfneto, que também deixei apenas terminar o primo(); (Em ambos bastaria por exemplo colar o código do @Matheus Maldi e mudando a entrada para N, em vez de a.)
  3. A lógica do @Matheus Maldi, no qual também já está praticamente tudo pronto. Basta usar as duas funções corretamente.

A minha sugestão é fazer os 3 códigos!!! Inicialmente escolhe um e tenta finalizar. Qualquer dúvida é só postar. Após, finaliza os outros também... por exemplo: você pode corrigir o que você idealizou e tentar fazer os outros 2 apenas como exercício. (Aí, a depender, pode reorganizar o seu com aquilo que achar interessante.)

 

  • Curtir 3
Postado
2 horas atrás, Simon Viegas disse:

A minha sugestão é fazer os 3 códigos!!! Inicialmente escolhe um e tenta finalizar. Qualquer dúvida é só postar. Após, finaliza os outros também... por exemplo: você pode corrigir o que você idealizou e tentar fazer os outros 2 apenas como exercício. (Aí, a depender, pode reorganizar o seu com aquilo que achar interessante.)



🥇 Sim, porque na prática abandonou a função que tinha escrito inicialmente

double fibonacci (int n)
{
    int a=1,b=1,x,i;
    if(n==1) x=a;
    if(n==2) x=b;
    for(i=3;i<=n;i++){
    x=a+b;
    a=b;
    b=x;
}
    return x;

E a que estava escrevendo

int primo (int a) {
   int i,k=0;
   for(i=1;i<=a;i++) {
      if(a%i==0) k++;
   }
   if(k==2) return 1;
   else return 0;
}

E bastaria juntar as duas em um loop para resolver seu problema, do modo como foi descrito aqui.

 

Exemplo didático de primo()

 

A função abaixo mostra uma possível maneira -- passo a passo --- de  como retornar 1 se o argumento recebido é primo
 

int				retorna_um_se_primo(unsigned int n)
{
	if (n < 2)		return 0;
	if (n == 2)		return(1);
	if (n % 2 == 0) return(0);
	unsigned int maior = (unsigned int)sqrt((double)n);
	unsigned int fator = 3;
	while (fator <= maior)
	{	if (n % fator == 0) return 0;
		fator += 2;
	}	// end while
	return 1;
}	// end retorna_um_se_primo()

 

  • Curtir 3
Postado

Boa noite, pessoal !

enfim conclui o programa, está rodando certinho, agradeço a todos que me auxiliaram.

#include "stdio.h"
 

int main()
{

  int a, b, auxiliar, i, n, primo, k;
 

  a = 0;
  b = 1;
 
  
  printf("Digite um número: ");

  scanf("%d", &n);
 
 
 
  
  for(i = 0; i < n; i++)
  {
    auxiliar = a + b;
    a = b;
    b = auxiliar;

    primo=0;
        for(k=1; k<=a; k++)
            if((a%k)==0)
                 primo++;
        if(primo==2)
            
   printf("%d\n", a);
  

 

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...