高精度加法:
P1601 A+B Problem(高精)

 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[510], b[510], k;
 4 int cmd()
 5 {
 6     if (a[0] == b[0])return 0;
 7     else if (a[0] > b[0])return 1;
 8     else return -1;
 9 }
10 void sum()//高精度加法
11 {
12     int  flag = cmd();
13     int i;
14     if (flag == 0||flag==1)k = a[0];
15     else if (flag == -1)k = b[0];
16     for (i = 1; i <= k; i++)
17     {
18         a[i + 1] += (a[i] + b[i]) / 10;
19         a[i] = (a[i] + b[i]) % 10;
20     }
21     while (a[k] >= 10)
22     {
23         a[k + 1] += a[k]/10;
24         a[k] = a[k]%10;
25         k++;
26     }
27     while (a[k + 1] > 0)k++;
28 }
29 int main()
30 {
31     char arr[510];
32     int i, j;
33     for (i = 1; i <= 2; i++)
34     {
35         scanf("%s", arr+1);
36         if (i == 1)
37         {
38             a[0] = strlen(arr+1);
39             for (j = 1; j <= a[0]; j++)
40                 a[a[0] - j+1] = arr[j]-'0';
41         }
42         else
43         {
44             b[0] = strlen(arr+1);
45             for (j = 1; j <= b[0]; j++)
46                 b[b[0] - j+1] = arr[j]-'0';
47         }
48     }
49     sum();
50     for (i = k; i >= 1; i--)
51         printf("%d", a[i]);
52     return 0;
53 }

0位存储位数,低位开始存低位,例如256  那么arr[0]=3; arr[ 1 ] = 6; arr[ 2 ] = 5; arr[ 3]=2

相加的时候从低位开始加,先进位,在取模

a[i + 1] += (a[i] + b[i]) / 10;//进位
a[i] = (a[i] + b[i]) % 10;//当前位
输出的时候从高位开始输出
最后要确保0位的值是结果的位数



高精度减法:
p2142 高精度减法
 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[10010], b[10010], k;
 4 int cmd()
 5 {
 6     if (a[0] == b[0])
 7     {
 8         int i;
 9         for (i = a[0]; i >= 1; i--)
10         {
11             if (a[i] > b[i]) return 1;
12             else if (a[i] < b[i])return -1;
13         }
14     }
15     else if (a[0] > b[0])return 1;
16     else if (a[0] < b[0])return -1;
17     return 0;
18 }
19 int stract()//高精度减法,1为正,-1为负
20 {
21     int  flag = cmd();
22     int i;
23     if (flag == 0) return 0;
24     if (flag == 1)
25     {
26         k = a[0];
27         a[0] = 1;
28         for (i = 1; i <= k; i++)
29         {
30             if (a[i] < b[i])
31             {
32                 a[i + 1]--;
33                 a[i] += 10;
34             }
35             a[i] -= b[i];
36         }
37         while (a[k] == 0)
38             k--;
39     }
40     else if (flag == -1)
41     {
42         k = b[0];
43         a[0] = -1;
44         for (i = 1; i <= k; i++)
45         {
46             if (a[i] > b[i])
47             {
48                 b[i + 1]--;
49                 b[i] += 10;
50             }
51             a[i] = b[i] - a[i];
52         }
53         while (b[k] == 0)
54             k--;
55     }
56     return 1;
57 }
58 int main()
59 {
60     char arr[10010];
61     int i, j, flag;
62     for (i = 1; i <= 2; i++)
63     {
64         scanf("%s", arr+1);
65         if (i == 1)
66         {
67             a[0] = strlen(arr+1);
68             for (j = 1; j <= a[0]; j++)
69                 a[a[0] - j+1] = arr[j]-'0';
70         }
71         else
72         {
73             b[0] = strlen(arr+1);
74             for (j = 1; j <= b[0]; j++)
75                 b[b[0] - j+1] = arr[j]-'0';
76         }
77     }
78     flag=stract();
79     if (!flag)printf("0");
80     else
81     {
82         if (a[0] == 1)
83         {
84             for (i = k; i >= 1; i--)
85                 printf("%d", a[i]);
86         }
87         else
88         {
89             printf("-");
90             for (i = k; i >= 1; i--)
91                 printf("%d", a[i]);
92         }
93     }
94     return 0;
95 }

首先cmd()判断两个值大小关系,保证用大的值减去小值,判断结果正负,在0位记录结果正负,1正 -1负

0位一开始是数值的位数,之后赋值给k,从低位开始减,不够减时就向高位借,高位为-1也是没关系的,会再向高位借

由于cmd()确保了大值减小的,所以最后必定够减,且每位都是0-9的正数

最后更新k值,k是结果的位数

 

 

高精度乘法:

P1303 A*B Problem

 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[2010], b[2010], c[5010], k, ka, kb;
 4 int multi()//高精度乘法(高精度*高精度)初始化为1;bug
 5 {
 6     int i, j;
 7     k = ka+kb;
 8     for (i = 0; i < ka; i++)
 9     {
10         for (j = 0; j < kb; j++)
11         {
12             c[i + j] += a[i] * b[j];
13             c[i + j+1 ] += c[i + j] / 10;
14             c[i + j] %= 10;
15         }
16     }
17     while (c[k]== 0)k--;
18     return 1;
19 }
20 int main()
21 {
22     char arr[10010];
23     int i, j, flag;
24     for (i = 1; i <= 2; i++)
25     {
26         scanf("%s", arr);
27         if (i == 1)
28         {
29             ka = strlen(arr);
30             for (j = 0; j <= ka; j++)
31                 a[ka-j-1] = arr[j]-'0';
32         }
33         else
34         {
35             kb = strlen(arr);
36             for (j = 0; j <= kb; j++)
37                 b[ kb-j-1] = arr[j]-'0';
38         }
39     }
40     flag=multi();
41     if (ka==1&&a[0]==0||kb==1&&b[0]==0)printf("0");
42     else
43     {
44         for (i = k; i >= 0; i--)
45             printf("%d", c[i]);
46     }
47     return 0;
48 }

依然是0位存位数,从1开始存低位,因为n位的数乘m位的数,结果的位数一定有y>=(m+n)

第a位乘第b位 必然只会对(a+b)位和(a+b+1)位有影响,因为是0-9的乘法所以最大只会是81

所以不会对(a+b+2)及之后的位有影响

接下来只需从低位开始更新最高位即可

k=ka+kb

考虑会有进位的情况

所以最后还要更新k的值使其等于结果的位数

还有高精度*低精度的算法,这里还是只需考虑9*x,看其会影响多少位更新c的值

例如x=12 此时9*12=108>99所以还会影响到(a+b+2)位,需要考虑

当影响位数过多时建议化成将x化成高精度,转化成高精度*高精度

 

高精度除法(待填坑)

P2142 高精度减法

posted on 2020-11-26 22:54  丶蛋花拉面  阅读(114)  评论(0)    收藏  举报