鱼C论坛

 找回密码
 立即注册
查看: 659|回复: 2

[已解决]数据结构

[复制链接]
发表于 2020-12-7 10:44:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[问题描述]设计一个程序实现两个任意 长的整数的求和运算

[输入形式]按中国对于长整数的表示习惯,每四位一一组, 组间用逗号隔开

[输出形式]每四位一组,组间用逗号隔开

【评分标准】任何整形变量的范围是:-(215-1)~(215-1)。采用恰当的存储结构,如:利用双向循环链表实现长整数的存储,每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表视为万位制数。可以利用头结点数据域的符号代表长整数的符号,用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数的位数规定上限。

【选作内容】修改上述程序,使它在整形量范围是-(2n-1)~(2n-1)的计算机上都能有效地运行。其中,n是由程序读入的参量。
最佳答案
2020-12-7 14:44:37
本帖最后由 xieglt 于 2020-12-7 14:53 编辑

后面才看到要考虑符号。又改了下,一个有符号的版本

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define BASE                (10000)
  5. #define        NUM_LEN                (4)
  6. #define        _BASE_SIZE        (1024)
  7. #define ISINIT(p)        ((p->_data != 0) && (p->_flag == 0))

  8. typedef struct tagInteger
  9. {
  10.         int * _data;
  11.         int _size;
  12.         int _len;
  13.         int _signed;
  14.         int _flag;
  15. }INTEGER,*LPINTEGER;

  16. int _InitInteger(LPINTEGER n,int size = 0)
  17. {
  18.         size = ((size == 0) ? _BASE_SIZE : size);
  19.        
  20.         n->_size = 0;
  21.         n->_data = (int *)malloc(size * sizeof(int));
  22.        
  23.         if(n->_data == 0)
  24.         {
  25.                 return 0;
  26.         }

  27.         memset(n->_data,0,size * sizeof(int));
  28.         n->_len = 0;
  29.         n->_size = size;
  30.         n->_flag = 0;
  31.         return 1;
  32. }

  33. void _UninitInteger(LPINTEGER n)
  34. {
  35.         if(ISINIT(n))
  36.         {
  37.                 free(n->_data);
  38.         }
  39. }

  40. int _ResizeInteger(LPINTEGER n,int _size = 0)
  41. {
  42.         int len = n->_size;
  43.        
  44.         if(!ISINIT(n))
  45.         {
  46.                 return _InitInteger(n,_size);
  47.         }
  48.                
  49.         if(_size < _BASE_SIZE)
  50.         {
  51.                 n->_size += _BASE_SIZE;
  52.         }
  53.         else
  54.         {
  55.                 n->_size += _size;
  56.         }
  57.                
  58.         n->_data = (int *)realloc(n->_data,n->_size * sizeof(int));
  59.                
  60.         if(n->_data == 0)
  61.         {
  62.                         return 0;
  63.         }
  64.        
  65.         memset(n->_data + len,0,(n->_size - len) * sizeof(int));
  66.         return 1;
  67. }

  68. int _String2Integer(LPINTEGER pNum,char * number)
  69. {
  70.         int i = 0;
  71.         int nRet = 0;
  72.         char cByte = 0;
  73.         int value = 0;
  74.         int power = 0;
  75.         int index =0;
  76.         int len = strlen(number);
  77.         int size = len / NUM_LEN + (len % NUM_LEN == 0 ? 0 : 1);
  78.         int flag = 0;

  79.         do
  80.         {
  81.                 if(len == 0)
  82.                 {
  83.                         break;
  84.                 }

  85.                
  86.                 if(number[0]=='-' || number[0]=='+')
  87.                 {
  88.                         if(number[0] == '-')
  89.                         {
  90.                                 flag = 1;
  91.                         }
  92.                        
  93.                         number ++;
  94.                         len --;
  95.                 }
  96.                
  97.                 if(!ISINIT(pNum) && _InitInteger(pNum,size) == 0)
  98.                 {
  99.                         break;
  100.                 }

  101.                 if(size > pNum->_size && _ResizeInteger(pNum,size) == 0)
  102.                 {
  103.                         break;
  104.                 }
  105.                
  106.                 for(i=0 ; i<len ; i++)
  107.                 {
  108.                         if(number[i]<'0' || number[i]>'9')
  109.                         {
  110.                                 break;
  111.                         }
  112.                 }
  113.                 if(i < len--)
  114.                 {
  115.                         break;
  116.                 }


  117.                 for(i=len ; i>=0 ; i--)
  118.                 {
  119.                         if((len - i) % NUM_LEN == 0)
  120.                         {
  121.                                 if(len - i != 0)
  122.                                 {
  123.                                         pNum->_data[index++] = value;
  124.                                 }

  125.                                 value = 0;
  126.                                 power = 1;
  127.                         }
  128.                         cByte = number[i] - 0x30;
  129.                         value += power * cByte;
  130.                         power *= 10;
  131.                 }

  132.                 if(value != 0)
  133.                 {
  134.                         pNum->_data[index++] = value;
  135.                 }
  136.                 pNum->_signed = flag;
  137.                 pNum->_len = index;
  138.                 while(pNum->_data[pNum->_len-1] == 0)
  139.                 {
  140.                         pNum->_len--;
  141.                 }
  142.                 nRet = 1;
  143.         }while(0);

  144.         return nRet;
  145. }

  146. int _Integer2String(LPINTEGER pNum,char * number)
  147. {
  148.         int i = 0;
  149.         int nRet = 0;
  150.         char buffer[16] = {0};
  151.        
  152.         do
  153.         {
  154.                 if(!ISINIT(pNum))
  155.                 {
  156.                         break;
  157.                 }

  158.                 if(number == 0)
  159.                 {
  160.                         nRet = pNum->_len * (NUM_LEN + 1) + 1;
  161.                         break;
  162.                 }

  163.                 number[0] = 0;

  164.                 if(pNum->_signed != 0)
  165.                 {
  166.                         strcat(number,"-");
  167.                 }
  168.                
  169.                 for(i=pNum->_len-1 ; i>=0 ; i--)
  170.                 {
  171.                         if(i == pNum->_len-1)
  172.                         {
  173.                                 sprintf(buffer,"%d",pNum->_data[i]);
  174.                         }
  175.                         else
  176.                         {
  177.                                 sprintf(buffer,"%04d",pNum->_data[i]);
  178.                         }
  179.                         strcat(number,buffer);
  180.                         if(i != 0)
  181.                         {
  182.                                 strcat(number,",");
  183.                         }
  184.                 }

  185.                 nRet = strlen(number);
  186.         }while(0);

  187.         return nRet;
  188. }

  189. void _PushBack(LPINTEGER src,int data)
  190. {

  191.         if(src->_len == src->_size)
  192.         {
  193.                 if(!_ResizeInteger(src))
  194.                 {
  195.                         return;
  196.                 }
  197.         }

  198.         src->_data[src->_len++] = data;
  199. }

  200. void _SimpleAdd(LPINTEGER src,LPINTEGER dst)
  201. {
  202.         int sizeofme = src->_len;
  203.         int sizeofyou = dst->_len;
  204.         int len = sizeofme >= sizeofyou ? sizeofme : sizeofyou;
  205.         int i = 0;
  206.         int value = 0;
  207.         int carry = 0;

  208.         for(i=0 ; i<len ; i++)
  209.         {
  210.                 value = carry;
  211.                 if(i < sizeofme)
  212.                 {
  213.                         value += src->_data[i];
  214.                 }

  215.                 if(i < sizeofyou)
  216.                 {
  217.                         value += dst->_data[i];
  218.                 }

  219.                 carry = value / BASE;
  220.                 value %= BASE;

  221.                 if(i < sizeofme)
  222.                 {
  223.                         src->_data[i] = value;
  224.                 }
  225.                 else
  226.                 {
  227.                         _PushBack(src,value);
  228.                 }
  229.         }

  230.         if(carry != 0)
  231.         {
  232.                 if(i < sizeofme)
  233.                 {
  234.                         src->_data[i] = carry;
  235.                 }
  236.                 else
  237.                 {
  238.                         _PushBack(src,carry);
  239.                 }
  240.         }
  241. };

  242. void _SimpleSub(LPINTEGER src,LPINTEGER dst)
  243. {
  244.         int sizeofme = src->_len;
  245.         int sizeofyou = dst->_len;
  246.         int i = 0;
  247.         int value = 0;
  248.         int carry = 0;
  249.        
  250.         for(i=0 ; i<sizeofme ; i++)
  251.         {
  252.                 value = src->_data[i];

  253.                 if(i < sizeofyou)
  254.                 {
  255.                         value -= dst->_data[i];
  256.                 }
  257.                
  258.                 value -= carry;
  259.                
  260.                 if(value < 0)
  261.                 {
  262.                         value += BASE;
  263.                         carry = 1;
  264.                 }
  265.                 else
  266.                 {
  267.                         carry = 0;
  268.                 }
  269.                 src->_data[i] = value;
  270.         }

  271.         while(src->_data[src->_len-1] == 0)
  272.         {
  273.                 src->_len--;
  274.         }
  275. }

  276. int _UnsignedCompare(LPINTEGER src,LPINTEGER dst)
  277. {
  278.         int i = 0;

  279.         if(src->_len > dst->_len)
  280.         {
  281.                 return 1;
  282.         }
  283.         else if(src->_len < dst->_len)
  284.         {
  285.                 return -1;
  286.         }
  287.        
  288.         for(i=src->_len-1 ; i>=0 ; i--)
  289.         {
  290.                 if(src->_data[i] > dst->_data[i])
  291.                 {
  292.                         return 1;
  293.                 }
  294.                 else if(src->_data[i] < dst->_data[i])
  295.                 {
  296.                         return -1;
  297.                 }
  298.         }

  299.         return 0;
  300. }

  301. void _CopyInteger(LPINTEGER dst,LPINTEGER src)
  302. {
  303.         if(!ISINIT(dst))
  304.         {
  305.                 if(!_InitInteger(dst,src->_size))
  306.                 {
  307.                         return;
  308.                 }
  309.         }
  310.         else if(dst->_size < src->_size)
  311.         {
  312.                 if(!_ResizeInteger(dst,src->_size))
  313.                 {
  314.                         return;
  315.                 }
  316.         }

  317.         memcpy(dst->_data,src->_data,src->_size);
  318.         dst->_len = src->_len;
  319.         dst->_signed = src->_signed;
  320. }

  321. void _UnsignedSub(LPINTEGER src,LPINTEGER dst)
  322. {
  323.         INTEGER n;
  324.         int _signed = src->_signed;

  325.         if(_UnsignedCompare(src,dst) == -1)
  326.         {

  327.                 _CopyInteger(&n,dst);
  328.                 _SimpleSub(&n,src);
  329.                 _CopyInteger(src,&n);
  330.                 _UninitInteger(&n);
  331.                 src->_signed = !_signed;
  332.         }
  333.         else
  334.         {
  335.                 _SimpleSub(src,dst);
  336.         }
  337. }

  338. void _AddInteger(LPINTEGER src,LPINTEGER dst)
  339. {
  340.         int _signed = src->_signed - dst->_signed;
  341.         if(_signed == 0)
  342.         {
  343.                 _SimpleAdd(src,dst);
  344.         }
  345.         else
  346.         {
  347.                 _UnsignedSub(src,dst);
  348.         }
  349. }

  350. void _SubInteger(LPINTEGER src,LPINTEGER dst)
  351. {
  352.         int _signed = src->_signed - dst->_signed;
  353.         if(_signed != 0)
  354.         {
  355.                 _SimpleAdd(src,dst);
  356.         }
  357.         else
  358.         {
  359.                 _UnsignedSub(src,dst);
  360.         }
  361. }

  362. int main(int argc, char* argv[])
  363. {
  364.         INTEGER n,m;
  365.         char buffer[128];
  366.         _InitInteger(&n);
  367.         _InitInteger(&m);
  368.         _String2Integer(&n,"-1234567890987654321012345678909876543210123");
  369.         _String2Integer(&m,"99998888777776666655555444433332222111100001234567890");
  370.        
  371.         _AddInteger(&n,&m);
  372.         _Integer2String(&n,buffer);
  373.         _UninitInteger(&n);
  374.         _UninitInteger(&m);
  375.         printf("%s",buffer);
  376.         return 0;
  377. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-7 14:08:59 | 显示全部楼层
用的数组实现
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define BASE                (10000)
  5. #define        NUM_LEN                (4)
  6. #define        _BASE_SIZE        (1024)
  7. #define ISINIT(p)        ((p->_data != 0) && (p->_flag == 0))

  8. typedef struct tagInteger
  9. {
  10.         int * _data;
  11.         int _size;
  12.         int _len;
  13.         int _flag;
  14. }INTEGER,*LPINTEGER;

  15. int _InitInteger(LPINTEGER n,int size = 0)
  16. {
  17.         size = ((size == 0) ? _BASE_SIZE : size);
  18.        
  19.         n->_size = 0;
  20.         n->_data = (int *)malloc(size * sizeof(int));
  21.        
  22.         if(n->_data == 0)
  23.         {
  24.                 return 0;
  25.         }

  26.         memset(n->_data,0,size * sizeof(int));
  27.         n->_len = 0;
  28.         n->_size = size;
  29.         n->_flag = 0;
  30.         return 1;
  31. }

  32. void _UninitInteger(LPINTEGER n)
  33. {
  34.         if(ISINIT(n))
  35.         {
  36.                 free(n->_data);
  37.         }
  38. }

  39. int _ResizeInteger(LPINTEGER n,int _size = 0)
  40. {
  41.         int len = n->_size;
  42.        
  43.         if(!ISINIT(n))
  44.         {
  45.                 return _InitInteger(n,_size);
  46.         }
  47.                
  48.         if(_size < _BASE_SIZE)
  49.         {
  50.                 n->_size += _BASE_SIZE;
  51.         }
  52.         else
  53.         {
  54.                 n->_size += _size;
  55.         }
  56.                
  57.         n->_data = (int *)realloc(n->_data,n->_size * sizeof(int));
  58.                
  59.         if(n->_data == 0)
  60.         {
  61.                         return 0;
  62.         }
  63.        
  64.         memset(n->_data + len,0,(n->_size - len) * sizeof(int));
  65.         return 1;
  66. }

  67. int _String2Integer(LPINTEGER pNum,char * number)
  68. {
  69.         int i = 0;
  70.         int nRet = 0;
  71.         char cByte = 0;
  72.         int value = 0;
  73.         int power = 0;
  74.         int index =0;
  75.         int nLen = strlen(number);
  76.         int size = nLen / NUM_LEN + (nLen % NUM_LEN == 0 ? 0 : 1);

  77.         do
  78.         {
  79.                 if(nLen == 0)
  80.                 {
  81.                         break;
  82.                 }
  83.                
  84.                 if(!ISINIT(pNum) && _InitInteger(pNum,size) == 0)
  85.                 {
  86.                         break;
  87.                 }

  88.                 if(size > pNum->_size && _ResizeInteger(pNum,size) == 0)
  89.                 {
  90.                         break;
  91.                 }
  92.                
  93.                 for(i=0 ; i<nLen ; i++)
  94.                 {
  95.                         if(number[i]<'0' || number[i]>'9')
  96.                         {
  97.                                 break;
  98.                         }
  99.                 }
  100.                 if(i < nLen--)
  101.                 {
  102.                         break;
  103.                 }


  104.                 for(i=nLen ; i>=0 ; i--)
  105.                 {
  106.                         if((nLen - i) % NUM_LEN == 0)
  107.                         {
  108.                                 if(nLen - i != 0)
  109.                                 {
  110.                                         pNum->_data[index++] = value;
  111.                                 }

  112.                                 value = 0;
  113.                                 power = 1;
  114.                         }
  115.                         cByte = number[i] - 0x30;
  116.                         value += power * cByte;
  117.                         power *= 10;
  118.                 }

  119.                 if(value != 0)
  120.                 {
  121.                         pNum->_data[index++] = value;
  122.                 }

  123.                 pNum->_len = index;               
  124.                 nRet = 1;
  125.         }while(0);

  126.         return nRet;
  127. }

  128. int _Integer2String(LPINTEGER pNum,char * number)
  129. {
  130.         int i = 0;
  131.         int nRet = 0;
  132.         char buffer[16] = {0};
  133.        
  134.         do
  135.         {
  136.                 if(!ISINIT(pNum))
  137.                 {
  138.                         break;
  139.                 }

  140.                 if(number == 0)
  141.                 {
  142.                         nRet = pNum->_len * NUM_LEN + 1;
  143.                         break;
  144.                 }

  145.                 number[0] = 0;
  146.                
  147.                 for(i=pNum->_len-1 ; i>=0 ; i--)
  148.                 {
  149.                         if(i == pNum->_len-1)
  150.                         {
  151.                                 sprintf(buffer,"%d",pNum->_data[i]);
  152.                         }
  153.                         else
  154.                         {
  155.                                 sprintf(buffer,"%04d",pNum->_data[i]);
  156.                         }
  157.                         strcat(number,buffer);
  158.                         if(i != 0)
  159.                         {
  160.                                 strcat(number,",");
  161.                         }
  162.                 }

  163.                 nRet = strlen(number);
  164.         }while(0);

  165.         return nRet;
  166. }

  167. void _PushBack(LPINTEGER src,int data)
  168. {

  169.         if(src->_len == src->_size)
  170.         {
  171.                 if(!_ResizeInteger(src))
  172.                 {
  173.                         return;
  174.                 }
  175.         }

  176.         src->_data[src->_len++] = data;
  177. }

  178. void _IntegerAdd(LPINTEGER src,LPINTEGER dst)
  179. {
  180.         int sizeofme = src->_len;
  181.         int sizeofyou = dst->_len;
  182.         int len = sizeofme >= sizeofyou ? sizeofme : sizeofyou;
  183.         int i = 0;
  184.         int value = 0;
  185.         int carry = 0;

  186.         for(i=0 ; i<len ; i++)
  187.         {
  188.                 value = carry;
  189.                 if(i < sizeofme)
  190.                 {
  191.                         value += src->_data[i];
  192.                 }

  193.                 if(i < sizeofyou)
  194.                 {
  195.                         value += dst->_data[i];
  196.                 }

  197.                 carry = value / BASE;
  198.                 value %= BASE;

  199.                 if(i < sizeofme)
  200.                 {
  201.                         src->_data[i] = value;
  202.                 }
  203.                 else
  204.                 {
  205.                         _PushBack(src,value);
  206.                 }
  207.         }

  208.         if(carry != 0)
  209.         {
  210.                 if(i < sizeofme)
  211.                 {
  212.                         src->_data[i] = carry;
  213.                 }
  214.                 else
  215.                 {
  216.                         _PushBack(src,carry);
  217.                 }
  218.         }

  219. };


  220. int main(int argc, char* argv[])
  221. {
  222.         INTEGER n,m;
  223.         char buffer[128];
  224.         _InitInteger(&n);
  225.         _InitInteger(&m);
  226.         _String2Integer(&n,"1234567890987654321012345678909876543210123");
  227.         _String2Integer(&m,"9999888877777666665555544443333222211110000");
  228.         _IntegerAdd(&n,&m);
  229.         _Integer2String(&n,buffer);
  230.         _UninitInteger(&n);
  231.         _UninitInteger(&m);
  232.         printf("%s",buffer);
  233.         return 0;
  234. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 14:44:37 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-12-7 14:53 编辑

后面才看到要考虑符号。又改了下,一个有符号的版本

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define BASE                (10000)
  5. #define        NUM_LEN                (4)
  6. #define        _BASE_SIZE        (1024)
  7. #define ISINIT(p)        ((p->_data != 0) && (p->_flag == 0))

  8. typedef struct tagInteger
  9. {
  10.         int * _data;
  11.         int _size;
  12.         int _len;
  13.         int _signed;
  14.         int _flag;
  15. }INTEGER,*LPINTEGER;

  16. int _InitInteger(LPINTEGER n,int size = 0)
  17. {
  18.         size = ((size == 0) ? _BASE_SIZE : size);
  19.        
  20.         n->_size = 0;
  21.         n->_data = (int *)malloc(size * sizeof(int));
  22.        
  23.         if(n->_data == 0)
  24.         {
  25.                 return 0;
  26.         }

  27.         memset(n->_data,0,size * sizeof(int));
  28.         n->_len = 0;
  29.         n->_size = size;
  30.         n->_flag = 0;
  31.         return 1;
  32. }

  33. void _UninitInteger(LPINTEGER n)
  34. {
  35.         if(ISINIT(n))
  36.         {
  37.                 free(n->_data);
  38.         }
  39. }

  40. int _ResizeInteger(LPINTEGER n,int _size = 0)
  41. {
  42.         int len = n->_size;
  43.        
  44.         if(!ISINIT(n))
  45.         {
  46.                 return _InitInteger(n,_size);
  47.         }
  48.                
  49.         if(_size < _BASE_SIZE)
  50.         {
  51.                 n->_size += _BASE_SIZE;
  52.         }
  53.         else
  54.         {
  55.                 n->_size += _size;
  56.         }
  57.                
  58.         n->_data = (int *)realloc(n->_data,n->_size * sizeof(int));
  59.                
  60.         if(n->_data == 0)
  61.         {
  62.                         return 0;
  63.         }
  64.        
  65.         memset(n->_data + len,0,(n->_size - len) * sizeof(int));
  66.         return 1;
  67. }

  68. int _String2Integer(LPINTEGER pNum,char * number)
  69. {
  70.         int i = 0;
  71.         int nRet = 0;
  72.         char cByte = 0;
  73.         int value = 0;
  74.         int power = 0;
  75.         int index =0;
  76.         int len = strlen(number);
  77.         int size = len / NUM_LEN + (len % NUM_LEN == 0 ? 0 : 1);
  78.         int flag = 0;

  79.         do
  80.         {
  81.                 if(len == 0)
  82.                 {
  83.                         break;
  84.                 }

  85.                
  86.                 if(number[0]=='-' || number[0]=='+')
  87.                 {
  88.                         if(number[0] == '-')
  89.                         {
  90.                                 flag = 1;
  91.                         }
  92.                        
  93.                         number ++;
  94.                         len --;
  95.                 }
  96.                
  97.                 if(!ISINIT(pNum) && _InitInteger(pNum,size) == 0)
  98.                 {
  99.                         break;
  100.                 }

  101.                 if(size > pNum->_size && _ResizeInteger(pNum,size) == 0)
  102.                 {
  103.                         break;
  104.                 }
  105.                
  106.                 for(i=0 ; i<len ; i++)
  107.                 {
  108.                         if(number[i]<'0' || number[i]>'9')
  109.                         {
  110.                                 break;
  111.                         }
  112.                 }
  113.                 if(i < len--)
  114.                 {
  115.                         break;
  116.                 }


  117.                 for(i=len ; i>=0 ; i--)
  118.                 {
  119.                         if((len - i) % NUM_LEN == 0)
  120.                         {
  121.                                 if(len - i != 0)
  122.                                 {
  123.                                         pNum->_data[index++] = value;
  124.                                 }

  125.                                 value = 0;
  126.                                 power = 1;
  127.                         }
  128.                         cByte = number[i] - 0x30;
  129.                         value += power * cByte;
  130.                         power *= 10;
  131.                 }

  132.                 if(value != 0)
  133.                 {
  134.                         pNum->_data[index++] = value;
  135.                 }
  136.                 pNum->_signed = flag;
  137.                 pNum->_len = index;
  138.                 while(pNum->_data[pNum->_len-1] == 0)
  139.                 {
  140.                         pNum->_len--;
  141.                 }
  142.                 nRet = 1;
  143.         }while(0);

  144.         return nRet;
  145. }

  146. int _Integer2String(LPINTEGER pNum,char * number)
  147. {
  148.         int i = 0;
  149.         int nRet = 0;
  150.         char buffer[16] = {0};
  151.        
  152.         do
  153.         {
  154.                 if(!ISINIT(pNum))
  155.                 {
  156.                         break;
  157.                 }

  158.                 if(number == 0)
  159.                 {
  160.                         nRet = pNum->_len * (NUM_LEN + 1) + 1;
  161.                         break;
  162.                 }

  163.                 number[0] = 0;

  164.                 if(pNum->_signed != 0)
  165.                 {
  166.                         strcat(number,"-");
  167.                 }
  168.                
  169.                 for(i=pNum->_len-1 ; i>=0 ; i--)
  170.                 {
  171.                         if(i == pNum->_len-1)
  172.                         {
  173.                                 sprintf(buffer,"%d",pNum->_data[i]);
  174.                         }
  175.                         else
  176.                         {
  177.                                 sprintf(buffer,"%04d",pNum->_data[i]);
  178.                         }
  179.                         strcat(number,buffer);
  180.                         if(i != 0)
  181.                         {
  182.                                 strcat(number,",");
  183.                         }
  184.                 }

  185.                 nRet = strlen(number);
  186.         }while(0);

  187.         return nRet;
  188. }

  189. void _PushBack(LPINTEGER src,int data)
  190. {

  191.         if(src->_len == src->_size)
  192.         {
  193.                 if(!_ResizeInteger(src))
  194.                 {
  195.                         return;
  196.                 }
  197.         }

  198.         src->_data[src->_len++] = data;
  199. }

  200. void _SimpleAdd(LPINTEGER src,LPINTEGER dst)
  201. {
  202.         int sizeofme = src->_len;
  203.         int sizeofyou = dst->_len;
  204.         int len = sizeofme >= sizeofyou ? sizeofme : sizeofyou;
  205.         int i = 0;
  206.         int value = 0;
  207.         int carry = 0;

  208.         for(i=0 ; i<len ; i++)
  209.         {
  210.                 value = carry;
  211.                 if(i < sizeofme)
  212.                 {
  213.                         value += src->_data[i];
  214.                 }

  215.                 if(i < sizeofyou)
  216.                 {
  217.                         value += dst->_data[i];
  218.                 }

  219.                 carry = value / BASE;
  220.                 value %= BASE;

  221.                 if(i < sizeofme)
  222.                 {
  223.                         src->_data[i] = value;
  224.                 }
  225.                 else
  226.                 {
  227.                         _PushBack(src,value);
  228.                 }
  229.         }

  230.         if(carry != 0)
  231.         {
  232.                 if(i < sizeofme)
  233.                 {
  234.                         src->_data[i] = carry;
  235.                 }
  236.                 else
  237.                 {
  238.                         _PushBack(src,carry);
  239.                 }
  240.         }
  241. };

  242. void _SimpleSub(LPINTEGER src,LPINTEGER dst)
  243. {
  244.         int sizeofme = src->_len;
  245.         int sizeofyou = dst->_len;
  246.         int i = 0;
  247.         int value = 0;
  248.         int carry = 0;
  249.        
  250.         for(i=0 ; i<sizeofme ; i++)
  251.         {
  252.                 value = src->_data[i];

  253.                 if(i < sizeofyou)
  254.                 {
  255.                         value -= dst->_data[i];
  256.                 }
  257.                
  258.                 value -= carry;
  259.                
  260.                 if(value < 0)
  261.                 {
  262.                         value += BASE;
  263.                         carry = 1;
  264.                 }
  265.                 else
  266.                 {
  267.                         carry = 0;
  268.                 }
  269.                 src->_data[i] = value;
  270.         }

  271.         while(src->_data[src->_len-1] == 0)
  272.         {
  273.                 src->_len--;
  274.         }
  275. }

  276. int _UnsignedCompare(LPINTEGER src,LPINTEGER dst)
  277. {
  278.         int i = 0;

  279.         if(src->_len > dst->_len)
  280.         {
  281.                 return 1;
  282.         }
  283.         else if(src->_len < dst->_len)
  284.         {
  285.                 return -1;
  286.         }
  287.        
  288.         for(i=src->_len-1 ; i>=0 ; i--)
  289.         {
  290.                 if(src->_data[i] > dst->_data[i])
  291.                 {
  292.                         return 1;
  293.                 }
  294.                 else if(src->_data[i] < dst->_data[i])
  295.                 {
  296.                         return -1;
  297.                 }
  298.         }

  299.         return 0;
  300. }

  301. void _CopyInteger(LPINTEGER dst,LPINTEGER src)
  302. {
  303.         if(!ISINIT(dst))
  304.         {
  305.                 if(!_InitInteger(dst,src->_size))
  306.                 {
  307.                         return;
  308.                 }
  309.         }
  310.         else if(dst->_size < src->_size)
  311.         {
  312.                 if(!_ResizeInteger(dst,src->_size))
  313.                 {
  314.                         return;
  315.                 }
  316.         }

  317.         memcpy(dst->_data,src->_data,src->_size);
  318.         dst->_len = src->_len;
  319.         dst->_signed = src->_signed;
  320. }

  321. void _UnsignedSub(LPINTEGER src,LPINTEGER dst)
  322. {
  323.         INTEGER n;
  324.         int _signed = src->_signed;

  325.         if(_UnsignedCompare(src,dst) == -1)
  326.         {

  327.                 _CopyInteger(&n,dst);
  328.                 _SimpleSub(&n,src);
  329.                 _CopyInteger(src,&n);
  330.                 _UninitInteger(&n);
  331.                 src->_signed = !_signed;
  332.         }
  333.         else
  334.         {
  335.                 _SimpleSub(src,dst);
  336.         }
  337. }

  338. void _AddInteger(LPINTEGER src,LPINTEGER dst)
  339. {
  340.         int _signed = src->_signed - dst->_signed;
  341.         if(_signed == 0)
  342.         {
  343.                 _SimpleAdd(src,dst);
  344.         }
  345.         else
  346.         {
  347.                 _UnsignedSub(src,dst);
  348.         }
  349. }

  350. void _SubInteger(LPINTEGER src,LPINTEGER dst)
  351. {
  352.         int _signed = src->_signed - dst->_signed;
  353.         if(_signed != 0)
  354.         {
  355.                 _SimpleAdd(src,dst);
  356.         }
  357.         else
  358.         {
  359.                 _UnsignedSub(src,dst);
  360.         }
  361. }

  362. int main(int argc, char* argv[])
  363. {
  364.         INTEGER n,m;
  365.         char buffer[128];
  366.         _InitInteger(&n);
  367.         _InitInteger(&m);
  368.         _String2Integer(&n,"-1234567890987654321012345678909876543210123");
  369.         _String2Integer(&m,"99998888777776666655555444433332222111100001234567890");
  370.        
  371.         _AddInteger(&n,&m);
  372.         _Integer2String(&n,buffer);
  373.         _UninitInteger(&n);
  374.         _UninitInteger(&m);
  375.         printf("%s",buffer);
  376.         return 0;
  377. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表