大整数运算

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 

 

以上是关于大整数运算的主要内容,如果未能解决你的问题,请参考以下文章

大整数运算

大整数四则运算

用Java的大整数类Integer来实现大整数的一些运算

大整数运算

大整数的存储与加减乘除四则运算

大整数运算