首页 > 其他 > 详细

大数相乘

时间:2015-09-25 07:05:54      阅读:257      评论:0      收藏:0      [点我收藏+]
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 unsigned char gacResult[1000];
  6 unsigned int guiIndex;
  7 unsigned int guiCount;
  8 unsigned int guiByteNum;
  9 unsigned int guiColum;
 10 unsigned int guiRow;
 11 char gacInput[10000];
 12 void getOperNum(char *pcInput, char *pcVal1, char *pcVal2, char *pcOperType)
 13 {
 14     unsigned int uiIndex = 0;
 15     unsigned int uiStart = 0;
 16     unsigned int uiEnd;
 17 
 18     while (1)
 19     {
 20         if (!(0<= *(pcInput + uiIndex) && 9 >= *(pcInput + uiIndex)))
 21         {
 22             uiEnd = uiIndex;
 23             if (0 == uiStart)
 24             {
 25                 memcpy(pcVal1, pcInput, uiIndex);
 26                 *(pcVal1 + uiIndex) = \0;
 27                 *pcOperType = *(pcInput + uiIndex);
 28 
 29                 uiIndex++;
 30                 uiStart = uiIndex;
 31             }
 32             else
 33             {
 34                 memcpy(pcVal2, pcInput + uiStart, uiIndex - uiStart);
 35                 *(pcVal2 + uiIndex - uiStart) = \0;
 36                 return;
 37             }
 38         }
 39         else
 40         {
 41             uiIndex++;
 42         }
 43     }
 44     return;
 45 }
 46 void ReverseBuff(unsigned char buff[1000], unsigned int uiLen)
 47 {
 48     unsigned int loop;
 49     char temp;
 50     for (loop = 0; loop < uiLen / 2; ++loop)
 51     {
 52         temp = buff[loop];
 53         buff[loop] = buff[uiLen - loop - 1];
 54         buff[uiLen - loop - 1] = temp;
 55     }
 56     //printf("\nReverseBuff: %s\n", buff);
 57 }
 58 void AddTotalNum(unsigned int uiAddNum[1000])
 59 {
 60     int loop;
 61     int index = 0;
 62     unsigned char buff[1000] = {0};
 63     unsigned int uiTemp = uiAddNum[guiColum - 1];
 64     for (loop = guiColum - 2; loop >= 0; --loop)
 65     {
 66         buff[index] = uiTemp % 10 + 0;
 67         uiTemp = uiTemp / 10;
 68         uiTemp += uiAddNum[loop];
 69         index++;
 70     }
 71     while (uiTemp % 10)
 72     {
 73         buff[index] = uiTemp % 10 + 0;
 74         uiTemp = uiTemp / 10;
 75         index++;
 76     }
 77     buff[index] = \0;
 78     ReverseBuff(buff, index);
 79     printf("%s = %s\n", gacInput, buff);
 80     
 81 }
 82 int main()
 83 {
 84     char acVal1[100], acVal2[100];
 85     unsigned int auiResult[100][100];
 86     char cOperType;
 87     unsigned int uiLenVal1, uiLenVal2, uiIndex1, uiIndex2;
 88     unsigned int uiAddCnt[1000] = {0};
 89     int wTemp1, wTemp2, loop;
 90     printf("*****************************************************\n");
 91     printf("\n\tLarge number multiplication\n");
 92     printf("\n\nexample: input \"123*123\"\n");
 93     printf("*****************************************************\n");
 94     while (1)
 95     {
 96         memset(auiResult, 0, 100 * 100 * sizeof(unsigned int));
 97         memset(uiAddCnt, 0, 100 * sizeof(unsigned int));
 98         
 99         scanf("%s", gacInput);
100         
101 
102         getOperNum(gacInput, acVal1, acVal2, &cOperType);
103 
104         //printf("%s \n%c \n%s\n****************************************************\n", acVal1, cOperType, acVal2);
105 
106         uiLenVal1 = strlen(acVal1);
107         uiLenVal2 = strlen(acVal2);
108         guiByteNum = uiLenVal1 * uiLenVal2;
109 
110         for (uiIndex1 = 0; uiIndex1 < uiLenVal1; ++uiIndex1)
111         {
112             for (loop = 0; loop < uiIndex1; ++loop)
113             {
114                 auiResult[uiIndex1][loop] = 0;
115                 //printf("%4d ", auiResult[uiIndex1][loop]);
116             }
117             for (uiIndex2 = 0; uiIndex2 < uiLenVal2; ++uiIndex2)
118             {
119                 wTemp1 = acVal1[uiIndex1] - 0;
120                 wTemp2 = acVal2[uiIndex2] - 0;
121                 auiResult[uiIndex1][uiIndex2 + loop] = wTemp1 * wTemp2;
122                 //printf("%4d ", auiResult[uiIndex1][uiIndex2 + loop]);
123             }
124             //printf("\n");
125         }
126         //printf("-----------------------------------------\n");
127 
128         /* TIP: uiLenVal1 > uiLenVal2 */
129         guiColum = uiLenVal1 + uiLenVal2 - 1;
130         guiRow = uiLenVal1;
131 
132         for (uiIndex1 = 0; uiIndex1 < uiLenVal1; ++uiIndex1)
133         {
134             for (uiIndex2 = 0; uiIndex2 < uiLenVal1 + uiLenVal2 - 1; ++uiIndex2)
135             {
136                 //printf("%4d ", auiResult[uiIndex1][uiIndex2]);
137             }
138             //printf("\n");
139         }
140         //printf("array: [%u, %u]\n-----------------------------------------\n",guiRow, guiColum);
141         
142         for (uiIndex1 = 0; uiIndex1 < guiColum; ++uiIndex1)
143         {
144             for (uiIndex2 = 0; uiIndex2 < guiRow; ++uiIndex2)
145             {    
146                 uiAddCnt[uiIndex1] += auiResult[uiIndex2][uiIndex1];
147             }
148             //printf("%4d ", uiAddCnt[uiIndex1]);
149         }
150 
151         AddTotalNum(uiAddCnt);
152         printf("\n**************************************************************\n");
153     }
154     return 0;
155 }

 

大数相乘

原文:http://www.cnblogs.com/alex-cnblog/p/4837008.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!