Lab 10-30-01

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

int is_prime(int n);
int fib(int);
int is_fib_prime(int n);
int flipCoin();
int longestHeads(int);
int longestAlternating(int);

#define HEADS		1
#define TAILS		0
#define MAX_TRIALS	100000000

void main(void) {


    int trials = MAX_TRIALS;
    int count;

    srand(time(NULL));

    count = longestHeads(trials);
    printf("longest sequence of heads was %d\n", count);

    count = longestAlternating(trials);
    printf("longest alternating sequence of heads and tails was %d\n", count);

    /* fib prime stuff
    int i;

    for (i = 1; i <= 36; i++) {

        //printf("fib(%d) = %d\n", i, fib(i) );
        int theFib = fib(i);

        if (is_prime(theFib))
            printf("fib(%d) = %d is prime\n", i, theFib);
    }
    */
}

int longestAlternating(int howMany) {

    int storedFlip;
    int lastFlip;
    int longestRun = 0;
    int counter = 0;

    int i;

    storedFlip = flipCoin();

    for(i = 2; i <= howMany; i++) {
        
        lastFlip = flipCoin();

        if (storedFlip != lastFlip) {
            counter++;
            storedFlip = lastFlip;
        }
        else {
            if (counter > longestRun) {
                longestRun = counter;
            }
            counter = 0;
        }
    }

    return longestRun;
}

int longestHeads(int howMany) {

    int longestRun = 0;
    int currentHeadCount = 0;

    int i;

    for(i = 1; i <= howMany; i++) {
        
        int coin = flipCoin();

        if (coin == HEADS) {
            currentHeadCount++;
        }
        else {
            if (currentHeadCount > longestRun) {
                longestRun = currentHeadCount;
            }
            
            currentHeadCount = 0;
        }
    }
    
    return longestRun;
}

int flipCoin() {

    return rand() % 2;
}

int is_fib_prime(int n) {

    return is_prime( fib(n) );
}

int fib(int n) {

    int answer;

    if (n == 1)
        answer = 0;
    else if (n == 2)
        answer = 1;
    else
        answer = fib(n - 2) + fib(n - 1);

    return answer;
}

/* 
    is_prime

    This function will return t/f whether or
    not the integer passed in is prime or not.

    input:	integer
    output:	0 or non-zero
*/
int is_prime(int n) {

    int divisor = 2;

    while (divisor <= sqrt(n) &&
           (n % divisor != 0)    ) {

        divisor++;
    }

    return n % divisor || n == 2;
}