Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 14th, 2012  |  syntax: None  |  size: 5.56 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <stdio.h>
  2.  
  3.  
  4. struct integer {
  5.         int* digits;
  6.         int size;
  7. };
  8.  
  9.  
  10. struct integer* convert_integer(char* stringInt);
  11. void print(struct integer* p);
  12. struct integer* add(struct integer *p, struct integer *q);
  13. int compare(struct integer *p, struct integer *q);
  14. struct integer* subtract(struct integer *p, struct integer *q);
  15.  
  16. int main () {
  17.  
  18.     int number;
  19.     int i;
  20.     int bigger;
  21.     int choice;
  22.     char convert1[200];
  23.     char convert2[200];
  24.  
  25.     FILE* ofp = fopen("bigint.txt", "r");
  26.  
  27.     fscanf(ofp, "%d" , &number);
  28.  
  29.     for (i=0; i<number; i++){
  30.  
  31.         fscanf(ofp , "%d" , &choice);
  32.         fscanf(ofp , "%s %s" , convert1, convert2);
  33.  
  34.         struct integer* numone;
  35.         struct integer* numtwo;
  36.         struct integer* addans;
  37.         struct integer* subans;
  38.  
  39.  
  40.         numone = convert_integer(convert1);
  41.         numtwo = convert_integer(convert2);
  42.  
  43.         bigger = compare(numone,numtwo);
  44.         printf("%d\n\n" , bigger);
  45.  
  46.  
  47.  
  48.         if (choice == 1){
  49.  
  50.             addans = add(numone, numtwo);
  51.             print(numone);
  52.             printf(" + ");
  53.             print(numtwo);
  54.             printf(" = ");
  55.             print(addans);
  56.             printf("\n\n");
  57.  
  58.         }
  59.  
  60.         else if (choice == 2){
  61.  
  62.             subans = subtract(numone, numtwo);
  63.             print(subans);
  64.             printf("\n\n");
  65.  
  66.         }
  67.  
  68.         else
  69.             printf("Invaild data");
  70.  
  71.     }
  72.  
  73.     /*free(numone->digits);
  74.     free(numtwo->digits);
  75.     free(numone);
  76.     free(numtwo);
  77.     free(addans->digits);
  78.     free(addans);
  79.     free(subans->digits);
  80.     free(subans);*/
  81.  
  82.     fclose(ofp);
  83.  
  84.     system ("PAUSE");
  85.     return 0;
  86. }
  87.  
  88. struct integer* convert_integer(char* stringInt){
  89.     struct integer* number;
  90.     number = (struct integer*) malloc(sizeof (struct integer));
  91.     int n;
  92.     n = strlen(stringInt);
  93.     number->digits = (int*) malloc (n*sizeof(int));
  94.     number->size = n;
  95.     int i;
  96.  
  97.     for (i=0; i<n; i++){
  98.         number->digits[i] = (int)(stringInt[number->size-1-i] - '0');
  99.     }
  100.     return number;
  101. }
  102.  
  103. void print(struct integer* p) {
  104.     int i;
  105.     for (i=p->size-1; i >= 0; i--) {
  106.         printf("%d" , p->digits[i]);
  107.     }
  108. }
  109.  
  110. struct integer* add(struct integer *p, struct integer *q){
  111.  
  112.     int larger;
  113.     int smaller;
  114.  
  115.  
  116.     if(p->size > q->size || p->size == q->size){
  117.         larger = p->size;
  118.         smaller = q->size;
  119.     }
  120.     else {
  121.         larger = q->size;
  122.         smaller = p->size;
  123.     }
  124.  
  125.     struct integer* answerarray;
  126.     answerarray = (struct integer*) malloc(sizeof (struct integer));
  127.     answerarray->size = larger+1;
  128.     answerarray->digits = (int*) calloc((larger+1), sizeof(int));
  129.  
  130.     int i;
  131.     int ans;
  132.     int carry = 0;
  133.  
  134.     for (i=0; i < smaller; i++){
  135.  
  136.         ans = p->digits[i] + q->digits[i];
  137.         printf("Current answer: %d\n", ans);
  138.         if(carry == 1) {
  139.             ans = ans + 1;
  140.             carry = 0;
  141.         }
  142.  
  143.         if (ans >= 10){
  144.             ans = ans % 10;
  145.             answerarray->digits[i] = ans;
  146.             carry = 1;
  147.         }
  148.         else {
  149.             answerarray->digits[i] = ans;
  150.         }
  151.  
  152.     }
  153.     for(i = i - 1; i < larger; i++)
  154.     {
  155.         if (carry == 1){
  156.             answerarray->digits[i] = 1;
  157.         }
  158.         else
  159.         {
  160.             answerarray->digits = (int*)realloc(answerarray->digits, (larger)*sizeof(int));
  161.             answerarray->size = larger;
  162.         }
  163.     }
  164.  
  165.     return answerarray;
  166. }
  167.  
  168. int compare(struct integer *p, struct integer *q){
  169.  
  170.  
  171.     if(p->size < q->size){
  172.         return -1;
  173.     }
  174.  
  175.     else if (p->size > q->size){
  176.         return 1;
  177.     }
  178.  
  179.     else {
  180.  
  181.         int i;
  182.         for (i = (p->size-1); i >= 0; i--) {
  183.  
  184.             if(p->digits[i] < q->digits[i]){
  185.                 return -1;
  186.             }
  187.  
  188.             else if (p->digits[i] > q->digits[i]){
  189.                 return 1;
  190.             }
  191.  
  192.         }
  193.     }
  194.  
  195.      return 0;
  196. }
  197.  
  198.  
  199. struct integer* subtract(struct integer *p, struct integer *q){
  200.  
  201.     int bigger;
  202.     int larger;
  203.  
  204.     bigger = compare(p, q);
  205.  
  206.         if (bigger == 1 || bigger == 0){
  207.             larger = p->size;
  208.         }
  209.         else {
  210.             larger = q->size;
  211.         }
  212.  
  213.     struct integer* answerarray;
  214.     answerarray = (struct integer*) malloc(sizeof (struct integer));
  215.     answerarray->digits = (int*) malloc((larger) * sizeof(int));
  216.     answerarray->size = larger;
  217.  
  218.     int i;
  219.     int ans;
  220.     int carry = 0;
  221.  
  222.     for (i=0; i <= larger; i++){
  223.  
  224.         if (bigger == 1 || bigger == 0){
  225.             ans = p->digits[i] - q->digits[i];
  226.         }
  227.         else {
  228.             ans = q->digits[i] - p->digits[i];
  229.         }
  230.  
  231.         if(carry == 1) {
  232.             ans = ans - 1;
  233.             carry = 0;
  234.         }
  235.  
  236.         if (ans <= 0){
  237.  
  238.             if (bigger == 1 || bigger == 0){
  239.                 ans = (p->digits[i] + 10) - q->digits[i];
  240.             }
  241.             else {
  242.                 ans = (q->digits[i] +10) - p->digits[i];
  243.             }
  244.             answerarray->digits[i] = ans;
  245.             carry ++;
  246.         }
  247.     }
  248.  
  249.         if (carry == 1){
  250.         answerarray->digits[answerarray->size-1] = answerarray->digits[answerarray->size-1] - 1;
  251.     }
  252.             if (bigger == 1 || bigger == 0){
  253.                 print(p);
  254.                 printf(" - ");
  255.                 print(q);
  256.                 printf(" = ");
  257.             }
  258.             else {
  259.                 print(q);
  260.                 printf(" - ");
  261.                 print(p);
  262.                 printf(" = ");
  263.             }
  264.  
  265.     return answerarray;
  266. }