User Tools

Site Tools


user:asowers:bignum

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
user:asowers:bignum [2012/11/30 01:31] – [Welcome to Bignum!] asowersuser:asowers:bignum [2012/11/30 01:33] (current) – [Welcome to Bignum!] asowers
Line 1: Line 1:
 +====Welcome to Bignum!====
 +
 +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
 +====Code====
 +
 +bignum.c
 +<code 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);
 +}
 +</code>
 +
 +add.h
 +<code c>
 +
 +#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
 +</code>
 +
 +sub.h
 +<code c>
 +#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
 +</code>
 +
 +multiply.h
 +<code c>
 +#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
 +</code>
 +
 +divide.h
 +<code c>
 +#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
 +</code>
 +
 +compiling and implementation
 +<cli>
 +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$ 
 +
 +</cli>