标签:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <assert.h> 6 #include <ctype.h> 7 #include <map> 8 #include <string> 9 #include <set> 10 #include <bitset> 11 #include <utility> 12 #include <algorithm> 13 #include <vector> 14 #include <stack> 15 #include <queue> 16 #include <iostream> 17 #include <fstream> 18 #include <list> 19 using namespace std; 20 21 const int MAXL = 500; 22 struct BigNum 23 { 24 int num[MAXL]; 25 int len; 26 }; 27 28 //高精度比较 a > b return 1, a == b return 0; a < b return -1; 29 int Comp(BigNum &a, BigNum &b) 30 { 31 int i; 32 if(a.len != b.len) return (a.len > b.len) ? 1 : -1; 33 for(i = a.len-1; i >= 0; i--) 34 if(a.num[i] != b.num[i]) return (a.num[i] > b.num[i]) ? 1 : -1; 35 return 0; 36 } 37 38 //高精度加法 39 BigNum Add(BigNum &a, BigNum &b) 40 { 41 BigNum c; 42 int i, len; 43 len = (a.len > b.len) ? a.len : b.len; 44 memset(c.num, 0, sizeof(c.num)); 45 for(i = 0; i < len; i++) 46 { 47 c.num[i] += (a.num[i]+b.num[i]); 48 if(c.num[i] >= 10) 49 { 50 c.num[i+1]++; 51 c.num[i] -= 10; 52 } 53 } 54 if(c.num[len]) 55 len++; 56 c.len = len; 57 return c; 58 } 59 //高精度减法,保证a >= b 60 BigNum Sub(BigNum &a, BigNum &b) 61 { 62 BigNum c; 63 int i, len; 64 len = (a.len > b.len) ? a.len : b.len; 65 memset(c.num, 0, sizeof(c.num)); 66 for(i = 0; i < len; i++) 67 { 68 c.num[i] += (a.num[i]-b.num[i]); 69 if(c.num[i] < 0) 70 { 71 c.num[i] += 10; 72 c.num[i+1]--; 73 } 74 } 75 while(c.num[len] == 0 && len > 1) 76 len--; 77 c.len = len; 78 return c; 79 } 80 //高精度乘以低精度,当b很大时可能会发生溢出int范围,具体情况具体分析 81 //如果b很大可以考虑把b看成高精度 82 BigNum Mul1(BigNum &a, int &b) 83 { 84 BigNum c; 85 int i, len; 86 len = a.len; 87 memset(c.num, 0, sizeof(c.num)); 88 //乘以0,直接返回0 89 if(b == 0) 90 { 91 c.len = 1; 92 return c; 93 } 94 for(i = 0; i < len; i++) 95 { 96 c.num[i] += (a.num[i]*b); 97 if(c.num[i] >= 10) 98 { 99 c.num[i+1] = c.num[i]/10; 100 c.num[i] %= 10; 101 } 102 } 103 while(c.num[len] > 0) 104 { 105 c.num[len+1] = c.num[len]/10; 106 c.num[len++] %= 10; 107 } 108 c.len = len; 109 return c; 110 } 111 112 //高精度乘以高精度,注意要及时进位,否则肯能会引起溢出,但这样会增加算法的复杂度, 113 //如果确定不会发生溢出, 可以将里面的while改成if 114 BigNum Mul2(BigNum &a, BigNum &b) 115 { 116 int i, j, len = 0; 117 BigNum c; 118 memset(c.num, 0, sizeof(c.num)); 119 for(i = 0; i < a.len; i++) 120 { 121 for(j = 0; j < b.len; j++) 122 { 123 c.num[i+j] += (a.num[i]*b.num[j]); 124 if(c.num[i+j] >= 10) 125 { 126 c.num[i+j+1] += c.num[i+j]/10; 127 c.num[i+j] %= 10; 128 } 129 } 130 } 131 len = a.len+b.len-1; 132 while(c.num[len-1] == 0 && len > 1) 133 len--; 134 if(c.num[len]) 135 len++; 136 c.len = len; 137 return c; 138 } 139 140 //高精度除以低精度,除的结果为c, 余数为f 141 void Div1(BigNum &a, int &b, BigNum &c, int &f) 142 { 143 int i, len = a.len; 144 memset(c.num, 0, sizeof(c.num)); 145 f = 0; 146 for(i = a.len-1; i >= 0; i--) 147 { 148 f = f*10+a.num[i]; 149 c.num[i] = f/b; 150 f %= b; 151 } 152 while(len > 1 && c.num[len-1] == 0) 153 len--; 154 c.len = len; 155 } 156 //高精度*10 157 void Mul10(BigNum &a) 158 { 159 int i, len = a.len; 160 for(i = len; i >= 1; i--) 161 a.num[i] = a.num[i-1]; 162 a.num[i] = 0; 163 len++; 164 //if a == 0 165 while(len > 1 && a.num[len-1] == 0) 166 len--; 167 } 168 169 //高精度除以高精度,除的结果为c,余数为f 170 void Div2(BigNum &a, BigNum &b, BigNum &c, BigNum &f) 171 { 172 int i, len = a.len; 173 memset(c.num, 0, sizeof(c.num)); 174 memset(f.num, 0, sizeof(f.num)); 175 f.len = 1; 176 for(i = len-1;i >= 0;i--) 177 { 178 Mul10(f); 179 //余数每次乘10 180 f.num[0] = a.num[i]; 181 //然后余数加上下一位 182 ///利用减法替换除法 183 while(Comp(f, b) >= 0) 184 { 185 f = Sub(f, b); 186 c.num[i]++; 187 } 188 } 189 while(len > 1 && c.num[len-1] == 0) 190 len--; 191 c.len = len; 192 } 193 void print(BigNum &a) //输出大数 194 { 195 int i; 196 for(i = a.len-1; i >= 0; i--) 197 printf("%d", a.num[i]); 198 puts(""); 199 } 200 //将字符串转为大数存在BigNum结构体里面 201 BigNum ToNum(char *s) 202 { 203 int i, j; 204 BigNum a; 205 a.len = strlen(s); 206 for(i = 0, j = a.len-1; s[i] != ‘\0‘; i++, j--) 207 a.num[i] = s[j]-‘0‘; 208 return a; 209 } 210 211 void Init(BigNum &a, char *s, int &tag) //将字符串转化为大数 212 { 213 int i = 0, j = strlen(s); 214 if(s[0] == ‘-‘) 215 { 216 j--; 217 i++; 218 tag *= -1; 219 } 220 a.len = j; 221 for(; s[i] != ‘\0‘; i++, j--) 222 a.num[j-1] = s[i]-‘0‘; 223 } 224 225 int main(void) 226 { 227 BigNum a, b; 228 char s1[100], s2[100]; 229 while(scanf("%s %s", s1, s2) != EOF) 230 { 231 int tag = 1; 232 Init(a, s1, tag); //将字符串转化为大数 233 Init(b, s2, tag); 234 a = Mul2(a, b); 235 if(a.len == 1 && a.num[0] == 0) 236 { 237 puts("0"); 238 } 239 else 240 { 241 if(tag < 0) putchar(‘-‘); 242 print(a); 243 } 244 } 245 return 0; 246 }
标签:
原文地址:http://www.cnblogs.com/xuesen1995/p/4334378.html