exercise.7-2.<The C Programming Language>.Page 136

Big Integer 失败啊......

TLHL28 posted @ Sun, 10 Aug 2008 04:33:14 +0800 in C语言 with tags C语言 , 1406 readers

记住这东西......

http://forum.ubuntu.org.cn/viewtopic.php?t=141934&highlight=

 

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAX 9000
  7.  
  8. char result[MAX];
  9. int i = 0;
  10.  
  11. enum {PASS, MINUS};
  12.  
  13. int sum(char *,char *,int);
  14. int ro(char *);
  15. void free_result();
  16. char *clear_zero(char *e);
  17.  
  18. int  main()
  19. {
  20.     char  fir[MAX];
  21.     char  sec[MAX];
  22.     char  thr[MAX];
  23.     char *e1,*e2,*chg;
  24.     int l1,l2,len;
  25.     int  cases;
  26.     int get_minus,swap;
  27.     int j;
  28.     int neg_print_minus;
  29.     int pattern;
  30.  
  31.     int get_negative;
  32.     int onebig;
  33.     int e1_minus, e2_minus, dminus;
  34.  
  35.     scanf("%d",&cases);
  36.     while(cases--)
  37.     {
  38.         e1 = fir;
  39.         e2 = sec;
  40.         neg_print_minus = 0;
  41.         onebig = 1;
  42.         e1_minus = 0; e2_minus = 0; dminus = 0;
  43.         scanf("%s%s",e1,e2);
  44.  
  45.         if (*e1 == '-' || *e2 == '-') {
  46.             if ( *e1 == '-' && *e2 == '-'){
  47.                 ++e1;
  48.                 ++e2;
  49.                 dminus = 1;
  50.             } else if (*e1 == '-') {
  51.                 ++e1;
  52.                 e1_minus = 1;
  53.             } else if (*e2 == '-') {
  54.                 ++e2;
  55.                 e2_minus = 1;
  56.             }
  57.             get_negative = 1;
  58.         } else
  59.             get_negative = 0;
  60.  
  61.         e1 = clear_zero(e1);
  62.         e2 = clear_zero(e2);
  63.         if (*e1 == '0' && *e2 == '0') {
  64.             printf("0\n0\n");
  65.             continue;
  66.         }
  67.         l1 = strlen(e1);
  68.         l2 = strlen(e2);
  69.  
  70.         len = l1 - l2;
  71.         onebig = 1;
  72.         get_minus = (len <= 0 && strcmp(e1,e2) < 0) ? 1 : 0;
  73.         if (len < 0 || get_minus) {
  74.             swap = 1;
  75.             onebig = 0;
  76.             chg = e1; e1 = e2; e2 = chg;
  77.             len = -len;
  78.         } else
  79.             swap = 0;
  80.         if (len != 0) {
  81.             for (j = 0; thr[j] != '\0'; ++j)
  82.                 thr[j] = '\0';
  83.             while (len--)
  84.                 thr[len] = '0';
  85.             //printf("len: %d,thr:%s\n",len,thr);
  86.             e2 = strcat(thr,e2);
  87.             //printf("e2:%s\n",e2);
  88.         } else
  89.             neg_print_minus = 0;
  90.  
  91.         for (pattern = PASS,j = 0;j < 2; j++, pattern = MINUS) {
  92.             if (get_negative && !dminus)
  93.                 pattern = (pattern == MINUS) ? PASS : MINUS;
  94.             //printf("~~ongbig:%d,dminus:%d,pattern:%d~~",onebig,dminus,pattern);
  95.             if (strcmp(e1,e2) == 0 && pattern == MINUS)
  96.                 neg_print_minus = 0;
  97.             else if (dminus && !(onebig == 0 && pattern == MINUS)) {
  98.                 neg_print_minus = 1;
  99.                 //printf("~do1~:");
  100.             } else if (onebig == 0 && e1_minus && pattern == PASS) {
  101.                 neg_print_minus = 1;
  102.                 //printf("~do2~:");
  103.             } else if (onebig == 0 && e2_minus && pattern == MINUS) {
  104.                 neg_print_minus = 1;
  105.                 //printf("~do2.1~:");
  106.             } else if (onebig && e1_minus) {
  107.                 neg_print_minus = 1;
  108.                 //printf("~do3~:");
  109.             } else
  110.                 neg_print_minus = 0;
  111.  
  112.             if(sum(e1,e2,pattern))
  113.                 strcat(result,"1");
  114.             if (get_negative == 0 && pattern == MINUS && (get_minus || swap))
  115.                 printf("-");
  116.             if (get_negative && neg_print_minus)
  117.                 printf("-");
  118.             if(ro(result) == 1)
  119.                 printf("0");   
  120.             printf("\n");
  121.             free_result();
  122.         }
  123.     }
  124.     return  0;
  125. }
  126.  
  127. int  sum(char *e1, char *e2,int pattern)
  128. {
  129.     int re = 0;
  130.     int carry = 0;
  131.     if (*e1 == '\0' && *e2 == '\0')
  132.         return 0;
  133.     else
  134.         carry = sum(++e1,++e2,pattern);
  135.     --e1;
  136.     --e2;
  137.  
  138.     if (pattern == MINUS ) {
  139.         if ((re = (*e1 - '0') - carry - (*e2 - '0')) < 0) {
  140.             result[i++] = re + 10 + '0';
  141.             return 1;
  142.         } else
  143.             result[i++] = re + '0';
  144.     } else if (pattern == PASS) {
  145.         if ((re = (*e1 - '0') + carry + (*e2 - '0')) >= 10) {
  146.             result[i++] = re - 10 + '0';
  147.             return 1;
  148.         } else
  149.             result[i++] = re + '0';
  150.         result[i] = '\0';
  151.     }
  152.     return 0;
  153. }
  154.  
  155. int ro(char *in) {
  156.     static int iszero = 0;
  157.     int jzero;
  158.     if (*in == '\0')
  159.         return 1;
  160.     else
  161.         jzero = ro(++in);
  162.     --in;
  163.     if (jzero) {
  164.         if (*in == '0')
  165.             iszero = 1;
  166.         else {
  167.             jzero = 0;
  168.             iszero = 0;
  169.         }
  170.     }
  171.     if (!iszero)
  172.         printf("%c",*in);
  173.     return jzero;
  174. }
  175.  
  176. void free_result()
  177. {
  178.     i = 0;
  179.     while (result[i] != '\0')
  180.         result[i++] = '\0';
  181.     i = 0;
  182. }
  183.  
  184. char *clear_zero(char *e)
  185. {
  186.     if (*e == '0')
  187.         while (*++e == '0' && *e == '\0')
  188.             ;
  189.     if (*e == '\0')
  190.         *--e = '0';
  191.     return e;
  192. }

 


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter