#include float farenheitToCelsius(float farenheit) { return (farenheit - 32.0) / 1.8; } float celsiusToFarenheit(float celsius) { return (celsius * 1.8) + 32.0; } int sizeofStr(char in[]) { int i = 0; for (i = 0; in[i] != '\0'; ++i) ; return i; } void printStrArray(char in[]) { int i; printf("{ "); for (i = 0; i < sizeofStr(in); ++i) { printf("%c", in[i]); if (i == sizeofStr(in) - 1) { printf(" }\n"); } else { printf(", "); } } } void printIntArray(int in[], int inLength) { int i; printf("{ "); for (i = 0; i < inLength; ++i) { printf("%d", in[i]); if (i == inLength - 1) { printf(" }\n"); } else { printf(", "); } } } int checkIntArraySorted(int in[], int inLength) { int i = 0; while(i < inLength - 1) { if (in[i] > in[i + 1]) return 0; ++i; } return 1; } void swapInt(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /* Count the number of digits an integer has */ unsigned long long intDigitCount(unsigned long long in) { unsigned long long largestDigit; int digitCount = 0; for (largestDigit = 1; in / largestDigit != 0; largestDigit *= 10) ++digitCount; return digitCount; } /* Expand an integer into an integer whose first unit is 1 followed by a leading trail of 0's*/ unsigned long long intDigitExpand(unsigned long long in) { int expandedDigit; for (expandedDigit = 1; in != 1; --in) expandedDigit *= 10; return expandedDigit; } /* Convert an integer array into a combined integer */ int intArrayToInt(int in[], int inLength) { int i; int out = 0; int currentDigit = inLength; for (i = 1; i <= inLength; ++i) { out += in[i - 1] * intDigitExpand(currentDigit); --currentDigit; } return out; } /* Split an integer into an integer array */ void intToIntArray(int in, int out[]) { int i; int j = 0; int currentDigit; for(i = intDigitCount(in); i >= 1; --i) { out[j] = in / intDigitExpand(i); in -= intDigitExpand(i) * out[j]; ++j; } } /* Pseudo Random Number Generator using the Middle-square method */ int randIntMiddleSquare(unsigned long long *seed, int iteration) { int i; int oldSeedLength = intDigitCount(*seed); for (i = 0; i < iteration; ++i) { unsigned long long seedSquared = *seed * *seed; unsigned long long seedSquaredLength = intDigitCount(seedSquared); printf("Seed squared: %d\n", seedSquared); printf("Seed squared length: %d\n", seedSquaredLength); int seedSquaredArray[seedSquaredLength]; int middleStart = (seedSquaredLength - oldSeedLength) / 2; printf("Middle start: %d\n", middleStart); int newSeedArray[oldSeedLength]; int j; intToIntArray(seedSquared, seedSquaredArray); for (int j = 0; j < oldSeedLength; ++j) { newSeedArray[j] = seedSquaredArray[middleStart]; ++middleStart; } printIntArray(newSeedArray, sizeof(newSeedArray) / sizeof(int)); unsigned long long newSeed = intArrayToInt(newSeedArray, sizeof(newSeedArray) / sizeof(int)); int newSeedLength = intDigitCount(newSeed); /* If the result has fewer than 2n digits, leading zeroes are added to compensate */ if (newSeedLength < oldSeedLength) newSeed *= intDigitExpand(oldSeedLength - newSeedLength) * 10; *seed = newSeed; } return *seed; } int randIntMiddleSquareRange(int start, int end, unsigned long long *seed) { int endLength = intDigitCount(end); if (endLength > intDigitCount(*seed)) return -1; unsigned long long randomNumber = randIntMiddleSquare(seed, 1); printf("The random number: %d\n", randomNumber); int randomNumberLength = intDigitCount(randomNumber); int randomNumberArray[randomNumberLength]; int truncatedNumber; int truncatedNumberArray[endLength]; int middleStart = (randomNumberLength - endLength) / 2; intToIntArray(randomNumber, randomNumberArray); for (int j = 0; j < endLength; ++j) { truncatedNumberArray[j] = randomNumberArray[middleStart]; ++middleStart; } truncatedNumber = intArrayToInt(truncatedNumberArray, sizeof(truncatedNumberArray) / sizeof(int)); if (truncatedNumber <= end && truncatedNumber >= start) return truncatedNumber; else randIntMiddleSquareRange(start, end, seed); } int main() { int unsortedArray[] = { 1, 5, 2, 1, 4, 8, 3, 2, 6, 7 }; int sortedArray[] = { 1, 2, 4, 8, 9, 9, 9 }; printf("Unsorted Array : "); printIntArray(unsortedArray, sizeof(unsortedArray) / sizeof(int)); printf("Unsorted Array Sorted?: %d\n", checkIntArraySorted(unsortedArray, sizeof(unsortedArray) / sizeof(int))); printf("Sorted Array : "); printIntArray(sortedArray, sizeof(sortedArray) / sizeof(int)); printf("Sorted Array Sorted?: %d\n", checkIntArraySorted(sortedArray, sizeof(sortedArray) / sizeof(int))); int number = 3372; int intArray[4]; intToIntArray(number, intArray); printIntArray(intArray, sizeof(intArray) / sizeof(int)); printf("Back to int %d\n", intArrayToInt(intArray, sizeof(intArray) / sizeof(int))); unsigned long long seed = 3791; printf("Squared: %d\n", seed * seed); int iteration = 1; printf("Starting random number %d\n", seed); printf("Random number is %d after iteration %d\n", randIntMiddleSquare(&seed, iteration), iteration); printf("Random: %d\n", randIntMiddleSquareRange(1, 10, &seed)); }