unsigned char 0 255 1 char 128 127







![高精度数的定义与读入 const int MAXLEN = 241; //最大长度为 240位 typedef int hp[MAXLEN]; //定义hp为高精度类型 void Str 高精度数的定义与读入 const int MAXLEN = 241; //最大长度为 240位 typedef int hp[MAXLEN]; //定义hp为高精度类型 void Str](https://slidetodoc.com/presentation_image/10c34909411401e08bad3b7af5bc2cb2/image-8.jpg)
![高精度数的输出 void Print(hp a) { int i, len; len = a[0]; for (i=len; i 高精度数的输出 void Print(hp a) { int i, len; len = a[0]; for (i=len; i](https://slidetodoc.com/presentation_image/10c34909411401e08bad3b7af5bc2cb2/image-9.jpg)





























- Slides: 38
基本整数类型的取值范围 类型 数值范围 占字节数 unsigned char 0. . 255 1 char -128. . 127 1 int (long) -2147483648. . 2147483647(109) 4 unsigned int (long) 0. . 4294967295 (109) 4 long -9223372036854775808. . 8 18 9223372036854775807 (10 ) 0. . 18446744073709551615 (1019 ) 8 unsigned long 使用时有限制。例如,不能作为数组的下标等。 3
高精度数的定义与读入 const int MAXLEN = 241; //最大长度为 240位 typedef int hp[MAXLEN]; //定义hp为高精度类型 void Str 2 hp(char *s, hp a) //s转换后存入a { int i, len; memset(a, 0, sizeof(a)); len = strlen(s); a[0] = len; for (i=0; i<len; i++) a[len-i] = s[i] - '0'; } 8
高精度数的输出 void Print(hp a) { int i, len; len = a[0]; for (i=len; i >=1; i--) printf(“%d”, a[i]); printf(“n”); } 9
高精度加法 问题描述: 输入a,b(<10240)两个数,输出a+b的值。 样例输入: 9999999999 1234567890 样例输出: 112345678901234567889 11
高精度加法 void add(hp a, hp b, hp c) { int len; memset(c, 0, sizeof(c)); if (a[0] > b[0]) len = a[0]; else len = b[0]; for (i=1; i<=len; i++) c[i] = a[i] + b[i]; for (i=1; i<=len; i++) { c[i+1] += c[i] / 10; c[i] %= 10; } } //清0 //求和的位数 //逐位相加 //� 理� 位 len++; while ( (len > 1) && (c[len] == 0)) //� 理最高位 len--; c[0] = len; 15
当N<=93 //用基本类型就可解决 unsigned long fibo(int n) { unsigned long f 0 , f 1 , t; int i; if ( (n == 1) || (n == 2) ) return 1; f 0 = 1; f 1 = 1; for (i=3; i<=n; i++) { t = f 0 + f 1; f 0 = f 1; f 1 = t; } return f 1; } 17
高精度减法运算 void sub(hp a, hp b, hp c) { int i, len; memset(c, 0, sizeof(c)); len = a[0]; for (i=1; i<=len; i++) c[i] = a[i] - b[i]; for (i=1; i<=len; i++) if (c[i] < 0) { c[i] += 10; c[i+1] -= 1; } } //a must be greater than b //� 理借位 while ( (len > 1) && (c[len] == 0) ) //整理差的� 度 len--; c[0] = len; int compare(hp a, hp b) { int len; len=(a[0]>b[0])? a[0] : b[0]; for (int i=len; i<=1; i--) if (a[i]>b[i]) return 1; else if (a[i]<b[i]) return -1; return 0; } if (compare(a, b)==-1) { sub (b, a, c); c[c[0]]=-c[c[0]]; } 22
比较两个高精度数大小 当a>b,返回 1; a<b, 返回-1;a==b,返回 0 int compare(hp a, hp b) { int i; if (a[0] > b[0]) return 1; if (a[0] < b[0]) return -1; for (i=a[0]; i>=1; i--) if (a[i] > b[i]) return 1; else if (a[i] < b[i]) return -1; return 0; } 23
高精度数乘以整型数运算 void multiply(hp a, int b, hp c) { int i, len; memset(c, 0, sizeof(c)); len = a[0]; for (i=1; i<=len; i++) c[i](i=1; = a[i]i<=len; *b; for i++) { for (i=1; i<=len; i++) t = a[i] * b + c[i]; { c[i] =+= t% c[i+1] c[i]10; / 10; c[i+1] += t c[i] %= 10; / 10; }} } len++; while (c[len]) { c[len+1] = c[len] / 10; c[len] %= 10; len++; } while ( (d[len] == 0) && ( len > 1)) len--; c[0] = len; 处理进位: 我们不知道整数b有多少位。 28
算法分析 a 8 3 7 b 6 4 c 32 12 28 1) b的第 1位乘a的各位 a c 5 3 8 3 7 b 6 4 6 8 5 a c 8 3 7 b 6 4 48 50 54 28 2) b的第 2位乘a的各位 for (i = 1; i <= lena; i++) for (j = 1; j <= lenb; j++) c[i+j-1] += a[i] * b[j]; 3) 处理c的各位进位 31
高精度数乘以高精度数 void high_multiply(hp a, hp b, hp c) { int i, j, len; memset(c, 0, sizeof(c)); for (i=1; i<= a[0]; i++) for (j=1; j<= b[0]; j++) c[i+j-1] += a[i] * b[j]; len = a[0] + b[0] + 1; for (i=1; i<= len; i++) { c[i+1] += c[i] / 10; c[i] = c[i] % 10; } while ((len > 1)) && (c[len] == 0)) len--; c[0] = len; } 33
高精度数除以整型数 void divide(hp a, long b, hp c, long r) { int i, len; memset(c, 0, sizeof(c)); r = 0; len = a[0]; for (i = len; i>=1; i--) { r = r * 10 + a[i]; c[i] = r / b; r = r % b; } } while ( (len > 1) && (c[len] == 0)) len--; c[0] = len; 37
作业 • Problem 1451 • Problem 1894 • Deadline 下周一12: 00 38






































