summaryrefslogtreecommitdiff
path: root/frontends/calculator/CEdev/examples/fileio_factorize/src/main.c
blob: 3be999224b5cfb7df03e16cc11d1b260e7c2bf46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <tice.h>

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

#include <fileioc.h>

void prime_factors(unsigned int n);

int primes[512];
unsigned int total_primes = 0;

/* Main Function */
void main(void) {
    /* Declare some variables */
    real_t *real_in;
    list_t *list_out;
    unsigned i;
    int in;

    /* Clear the homescreen */
    os_ClrHome();

    /* Get the answer variable */
    if (ti_RclVar(TI_REAL_TYPE, ti_Ans, &real_in)) return;    
    if ((in = os_RealToInt24(real_in)) < 1) return;

    /* Get the prime factors of the input */
    prime_factors((unsigned)in);

    /* Create a list to store the primes */
    if (!total_primes) return;
    list_out = ti_MallocList(total_primes); // Same as ti_AllocList(total_primes, malloc)

    /* Write out the list of primes */
    for (i=0; i<total_primes; i++) {
        list_out->items[i] = os_Int24ToReal(primes[i]);
    }

    /* Set the new answer */
    ti_SetVar(TI_REAL_LIST_TYPE, ti_Ans, list_out);
}

/* Store to an array all the prime numbers */
void prime_factors(unsigned int n) {
    unsigned int div, end;

    while (!(n % 2)) {
        primes[total_primes++] = 2;
        n /= 2;
    }

    if (n == 1) return;

    div = 3;
    end = sqrt(n);

    while (div <= end) {
        if (!(n % div)) {
            do {
                primes[total_primes++] = div;
                n /= div;
            } while (!(n % div));
            if (n == 1) return;
            end = sqrt(n);
        }
        div += 2;
    }

    primes[total_primes++] = n;
}