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