Mais do que simplesmente Fibonacci

Na matemática, a Sequência de Fibonacci é uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente corresponde a soma dos dois anteriores. A sequência recebeu o nome do matemático italiano Leonardo de Pisa, mais conhecido por Fibonacci, que descreveu, no ano de 1202, o crescimento de uma população de coelhos, a partir desta.

A sequência de Fibonacci tem aplicações na análise de mercados financeiros, na ciência da computação e na teoria dos jogos. Também aparece em configurações biológicas, como, por exemplo, na disposição dos galhos das árvores.

Os números de Fibonacci são, portanto, os números que compõem a seguinte sequência: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, …

Elabore um algoritmo que leia um valor k, onde k é o número de termos da sequência. Por exemplo, se o valor de k for 8, o termos serão 0, 1, 1, 2, 3, 5, 8, 13. Baseado nisso, se o k-ésimo termo for um número primo, mostre o maior valor par da sequência, caso contrário, mostre o somatório dos termos.

Exemplo:
Entrada: 8
o k-ésimo termo é o número 13, que é primo, então mostra o número 2 que é o maior número par dentro da sequência.

Entrada: 9
o k-ésimo termo é o número 21, que não é primo, então mostra 54 (0+1+1+2+3+5+8+13+21 = 54).

Solução em C/C++, sem utilizar função

#include <stdio.h>

int main(void) {
	//já inicializou os dois primeiros termos
	//soma começa em 1, que o somatório dos dois primeiros termos
	int k, i, ult=1, pen=0, atual, termos, par, soma=1, primo=1;
	scanf("%i", &k);
	
	printf("%i %i ", pen, ult);
	for (termos=3; termos<=k; termos++) {
		atual = ult + pen;
		pen = ult;
		ult = atual;
		printf("%i ", atual);
		
		if (atual % 2 == 0) {
			par = atual;
		}
		soma+=atual;
	} 
	
	printf("\nSoma: %i \nMaior par: %i", soma, par);
	
	//considero que o termo atual é primo e tento mostrar que não é
	for (i=2; i<=atual/2; i++) {
		if (atual%i == 0) {
			primo = 0;
			printf("\nDividiu por %i \n", i);
			break; //já encontrei um outro numero divisível, posso parar
		}
	}
	
	if (primo) {
		printf("%i", par);
	} else {
		printf("%i", soma);
	}
	return 0;
}

Teste o código: http://ideone.com/0eqaiR

Share

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.