So the semester's winding down and Bignum is done. I don't think my solution was very intuitive; the two numbers are character arrays. There program works however and was a brilliant testing of pointer and array manipulation with a small amount of struct fun I threw in at the end for practice. The struct does nothing(the program works without it), but served as a quaint tutorial for what's to come later. Overall, I'm pleased with the result. bignum location is @ /home/asowers/src/cprog/new_bignum BONUS: check out option 5
bignum.c
#include <stdlib.h> #include <stdio.h> #include <math.h> #include "add.h" #include "multiply.h" #include "sub.h" #include "divide.h" struct { char *first; char *second; int length; int count; int div; }n; int main() { int select=1; printf("Welcome to BigNum!\n"); printf("select a length for your array size: "); scanf("%u", &n.length); n.length = n.length-1; n.first = (char*)malloc(sizeof(char)*n.length); printf("\nFirst number: "); fgetc(stdin); for(n.count = n.length; n.count >= 0; -- n.count) { n.first[n.count] = fgetc(stdin); n.first[n.count] = n.first[n.count] - 48; } n.second = (char*)malloc(sizeof(char)*n.length); printf("\nSecond number: "); fgetc(stdin); for(n.count = n.length; n.count >= 0; -- n.count) { n.second[n.count] = fgetc(stdin); n.second[n.count] = n.second[n.count] - 48; } while(select != 0 ){ printf("_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_\n"); printf("|Please choose an Option(1-5): |\n"); printf("|Option 1: Add |\n"); printf("|Option 2: Subtract |\n"); printf("|Option 3: Multiply |\n"); printf("|Option 4: Divide |\n"); printf("|Option 5: Exit |\n"); printf("-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n"); scanf("%d", &select); if (select == 1){ printf("\nYou selected addition.\nThe answer is: "); n.first = add(n.first, n.second, n.length); for (n.length; n.length>=0; --n.length) { printf("%hhu", n.first[n.length]); } printf("\n"); break;} else if (select == 2){ printf("\nYou selected subtraction.\nThe answer is: "); n.first = sub(n.first, n.second, n.length); for (n.length; n.length>=0; --n.length) { printf("%hhu", n.first[n.length]); } printf("\n"); break;} else if (select == 3){ printf("\nYou selected multiplication.\nThe answer is: "); multiply(n.first, n.second, n.length); for (n.length; n.length>=0; --n.length) { printf("%hhu", n.first[n.length]); } printf("\n"); break;} else if (select == 4){ printf("\nYou selected division.\nThe answer is: "); divide(n.first, n.second, n.length, &n.div); printf("%hhu", n.div); printf("\n"); break;} else if (select == 5){ printf("\nYou selected to exit.\nThe answer is: Tom's mom"); break;} else{ printf("Incorrect in.\n"); } } printf("\nGoodbye!\n"); return(0); }
add.h
#ifndef _ADDITION_H #define _ADDITION_H char * add(char * first, char * second, int length) { int count = 0; char carry = 0; for(count; count <= length; ++count) { int holder = (first[count] + second[count])+carry; if (holder > 9) { first[count] = holder-10; carry=1; } else { first[count] = holder; carry=0; } } return first; } #endif
sub.h
#ifndef _SUB_H #define _SUB_H char * sub(char *first, char *second, int length) { char count = 0; for(count; count <= length; ++count) { if (first[count] < second[count]) { first[count+1] = first[count+1] - 1; first[count] = first[count] + 10; } first[count] = first[count] - second[count]; } return first; } #endif
multiply.h
#ifndef _MULTIPLY_H #define _MULTIPLY_H #include <math.h> #include "sub.h" void multiply(char * first, char * second, int length) { int count = 0; int holder = 0; char *third; third = (char*)malloc(sizeof(char)*length); for (count; count <= length; ++count) { third[count] = first[count]; } for(count=0; count <= length; ++count) { holder = (second[count]*pow(10, count)); for(holder; holder > 0; --holder) { first = add(first, third, length); } } first = sub(first, third, length); } #endif
divide.h
#ifndef _DIVIDE_H #define _DIVIDE_H void divide(char * first, char * second, int length, int *div) { int count = 0; char *fourth; fourth = (char*)malloc(sizeof(char)*length); for (count; count <= length; ++count) { fourth[count] = first[count]; } for(count=length; count>=0; --count) { while(first[count] > 0) { ++*div; first = sub(first, second, length); } } } #endif
compiling and implementation
lab46:~/src/cprog/new_bignum$ gcc bignum.c -o bignum -lm lab46:~/src/cprog/new_bignum$ ./bignum Welcome to BigNum! select a length for your array size: 4 First number: 1234 Second number: 0100 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ |Please choose an Option(1-5): | |Option 1: Add | |Option 2: Subtract | |Option 3: Multiply | |Option 4: Divide | |Option 5: Exit | -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- 1 You selected addition. The answer is: 1334 Goodbye! lab46:~/src/cprog/new_bignum$ ./bignum Welcome to BigNum! select a length for your array size: 5 First number: 09999 Second number: 00001 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ |Please choose an Option(1-5): | |Option 1: Add | |Option 2: Subtract | |Option 3: Multiply | |Option 4: Divide | |Option 5: Exit | -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- 1 You selected addition. The answer is: 10000 Goodbye! Welcome to BigNum! select a length for your array size: 5 First number: 00400 Second number: 00050 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ |Please choose an Option(1-5): | |Option 1: Add | |Option 2: Subtract | |Option 3: Multiply | |Option 4: Divide | |Option 5: Exit | -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- 3 You selected multiplication. The answer is: 20000 Goodbye! lab46:~/src/cprog/new_bignum$ ./bignum Welcome to BigNum! select a length for your array size: 4 First number: 5250 Second number: 0050 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ |Please choose an Option(1-5): | |Option 1: Add | |Option 2: Subtract | |Option 3: Multiply | |Option 4: Divide | |Option 5: Exit | -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- 4 You selected division. The answer is: 105 Goodbye! lab46:~/src/cprog/new_bignum$ ./bignum Welcome to BigNum! select a length for your array size: 1 First number: 1 Second number: 1 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ |Please choose an Option(1-5): | |Option 1: Add | |Option 2: Subtract | |Option 3: Multiply | |Option 4: Divide | |Option 5: Exit | -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- 5 You selected to exit. The answer is: Tom's mom Goodbye! lab46:~/src/cprog/new_bignum$