大整数运算
Posted blue-lin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大整数运算相关的知识,希望对你有一定的参考价值。
Date:2019-07-11 19:42:01
算法实现
1 /* 2 Data: 2019-05-03 15:02:26 3 Problem: 4 */ 5 6 //存储 7 struct bign 8 9 int d[M]; 10 int len; 11 bign() 12 13 fill(d,d+M,0); 14 len=0; 15 16 ; 17 18 //字符串->大数 19 bign Change(char str[]) 20 21 bign a; 22 a.len = strlen(str); 23 for(int i=0; i<a.len; i++) 24 a.d[i] = str[a.len-i-1]-‘0‘; //字符串逆置存储 25 return a; 26 27 28 //比较 29 int Compare(bign a, bign b) 30 31 if(a.len > b.len) 32 return 1; 33 else if(a.len < b.len) 34 return -1; 35 else 36 37 for(int i=a.len-1; i>=0; i--) 38 if(a.d[i] > b.d[i]) return 1; 39 else if(a.d[i] < b.d[i]) return -1; 40 return 0; 41 42 43 44 //高精度加法 45 bign Add(bign a, bign b) 46 //其中之一为负数则采用减法,均为负数则相加再添符号 47 bign c; 48 int carry=0; //进位 49 for(int i=0; i<a.len||i<b.len; i++) 50 51 int temp = a.d[i]+b.d[i]+carry; 52 c.d[c.len++] = temp%10; 53 carry = temp/10; 54 55 if(carry != 0) 56 c.d[c.len++] = carry; 57 return c; 58 59 60 //A+B 61 #include<stdio.h> 62 #include<string.h> 63 const int M=1e3; 64 struct bign 65 66 int d[M]; 67 int len; 68 bign() 69 70 memset(d,0,sizeof(d)); 71 len=0; 72 73 ; 74 75 //小端存储 76 bign Change(char str[]) 77 78 bign a; 79 a.len = strlen(str); 80 for(int i=0; i<a.len; i++) 81 a.d[i] = str[a.len-i-1]-‘0‘; 82 return a; 83 84 85 bign Add(bign a, bign b) 86 87 bign c; 88 int carry=0; 89 for(int i=0; i<a.len||i<b.len; i++) 90 91 int temp = a.d[i]+b.d[i]+carry; 92 c.d[c.len++] = temp%10; 93 carry = temp/10; 94 95 if(carry != 0) 96 c.d[len++] = carry; 97 return c; 98 99 100 void Print(bign a) 101 102 for(int i=a.len-1; i>=0; i--) 103 printf("%d", a.d[i]); 104 105 106 int main() 107 108 char str1[M], str2[M]; 109 scanf("%s%s", str1,str2); 110 bign a = Change(str1); 111 bign b = Change(str2); 112 Print(add(a,b)); 113 return 0; 114 115 116 //高精度减法 117 bign Sub(bign a, bign b) 118 //若a<b,交换a,b,添负号 119 bign c; 120 for(int i=0; i<a.len||i<b.len; i++) 121 122 if(a.d[i] < b.d[i]) 123 124 a.d[i+1]--; 125 a.d[i]+=10; 126 127 c.d[c.len++] = a.d[i]-b.d[i]; 128 129 130 131 //高精度与低精度的乘法 bign * int 132 bign Multi(bign a, int b) 133 //负数取绝对值再相乘,高精度乘高精度,则外面套一层bign b的循环即可 134 bign c; 135 int carry=0; 136 for(int i=0; i<a.len; i++) 137 138 int temp = a.d[i]*b + carry; 139 c.d[c.len++] = temp%10; 140 carry = temp/10; 141 142 while(carry != 0) 143 144 c.d[c.len++] = carry%10; 145 carry /= 10; 146 147 return c; 148 149 150 //高精度与低精度的除法 151 bign Divide(bign a, int b, int &r) //余数为r,初值=0 152 153 bign c; 154 c.len = a.len; //被除数与商的各位一一对应 155 for(int i=a.len-1; i>=0; i--) 156 157 r = r*10 + a.d[i]; 158 if(r < b) c.d[i]=0; //不够除 159 else 160 161 c.d[i] = r/b; 162 r %= b; 163 164 165 while(c.len>1 && c.d[c.len-1]==0) 166 c.len--; //去除高位的0,若全是0,则保留一位0 167 return c; 168
以上是关于大整数运算的主要内容,如果未能解决你的问题,请参考以下文章