summaryrefslogtreecommitdiffstats
path: root/main.c
blob: af3ccb4defc5e7a8cea00a3d085054460dc196ab (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "primes.h"
#define DEFAULT_SIZE 30

//powq(): square roots
unsigned long long powq(int number, int power)
{
unsigned long long result = 1;//result int, 1 by default
if (!power){return 1;}//if to the power of 0, return 1
while(power)//loop until all powers have been calculated
	{
	result *= number;//in the end result=number*number*number*etc until power is reached
	--power;//--power since a power has been calculated
	}
return result;
}

void checkPrime(char s[], int length)
{
//if (s[0] == '\0'){result[0] = 'E'; result[1] = '\0'; return;}//catch case of blank input
//if (s[0] == '0' && s[1] == '\0'){printf("0\t| 0\n"); result[0] = '0'; result[1] = '\0'; return;}//catch case of 0 input
if (s[0] == '\0'){printf("Error\n");  return;}//catch case of blank input
if (s[0] == '0' && s[1] == '\0'){printf("Error\n"); return;}//catch case of 0 input
if (s[0] == '1' && s[1] == '\0'){printf("We all know that 1 isn't a prime number\n"); return;}//catch case of 1 input

int power = 0;  //int to store the power.
while(s[power] != '\0'){++power;}//increment power for however many non-null chars in the string.
--power;//The correct power is actually one less than above returns

int i = 0;//counter int
long input = 0;//where the converted int is stored
while (s[i] != '\0')//convert the string of decimal numbers into a long long int
	{
	if (s[i] >= '0' && s[i] <= '9'){input += ((s[i] - '0') * powq(10,power));}//integer = integer + ([char converted to number] * (10^[position of number in string]))
	++i;
	--power;//Deincrement the power. E.g. ([charvalue]*(10^3))+([nextcharvalue]*(10^2)) etc
	}

double squareRoot = sqrt((double)input);
printf("Square root: %lf\n", squareRoot);

i=0;
while(1)
	{
	if (primes[i] > (int)squareRoot){printf("%d is larger than %lf. Prime\n", primes[i], squareRoot); return;}//if the prime is larger than the integer part of the sqaure root, it is not a prime
	if ((input % primes[i]) != 0)
		{
		printf("%ld / %d = %lf not round\n", input, primes[i], (double)input/primes[i]);
		if (i > 998){printf("Out of primes. Good job\n"); exit(1);}
		++i;//move up to next prime
		}
	else
		{
		printf("%ld / %d = %ld round\n", input, primes[i], input/primes[i]);
		printf("Round result, number is not prime\n");
		break;
		}

	}


}

int main(int argc, char *argv[])
{
char input[DEFAULT_SIZE];//input string is DEFAULT_SIZE in length

if (!argv[1]){goto stdinMode;}

	if (argv[1])
		{
		printf("Usage (stdin mode): %s\n", argv[0]);
		printf("Ctrl+D to exit\n");
		printf("Determines if number is prime and shows working.\n");
		printf("Licence: GPLv3\n");
		return 0;
		}

stdinMode: ;
int i;
nextnum: i=0;
char *character = fgets(input, DEFAULT_SIZE, stdin);
if (!character){exit(0);}//exit if EOF (fgets() returns -1 on EOF or error)
character = strstr(input,"\n");//try to find the newline in the input so it can be overwritten
if (!character){printf("Input too long\n"); while(getchar() != '\n'); goto nextnum;}//if more than 40 chars were read, input was too long
character = '\0'; //overwrite newline with null char

//strip out invalid chars from the input string
int j;//another counter variable
for (i=0; input[i] != '\0'; ++i)
        {
        if ((input[i] < '0')||(input[i] > '9'))//if input[i] is an invalid character
                {
                j=i;
                while(input[j] != '\0'){input[j++] = input[j+1];}//shift all characters above left, overwriting the character
                --i;//deincrement i, since the string was just shrunk by one and the one just above could indeed be a matching char
                }
        }

checkPrime(input, DEFAULT_SIZE-1);

goto nextnum;

return 0;
}