大整数运算

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 }

 

posted @ 2019-07-11 19:43  林東雨  阅读(274)  评论(0编辑  收藏  举报