加减乘:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAX 50000
struct bigint {
int num[MAX],len;
} a,b,c;
int anum[MAX],bnum[MAX];
void read (bigint &a) {//'&' 可以使读入的 a 能够被返回(真正赋值)
char str[MAX];
cin>>str;
int k = strlen(str);
while(str[MAX] == 0) k--;
a.len = k;
for(int i = 0; i < a.len ; i++) {
a.num [i] = str[i] - '0';
}
reverse(a.num , a.num + a.len );//倒着储存 方便很多
}
void plue(bigint &a, bigint &b, bigint &c) {//加法
c.len = max(a.len , b.len );
for(int i = 0; i < c.len ; i++) {
c.num [i] = a.num [i] + b.num [i];
}
for(int i = 0; i < c.len ; i++) {
if(c.num [i] > 9) {
c.num [i] -= 10;
c.num [i + 1] += 1;
}
}
if(c.num[c.len] != 0) c.len++;//c.len 为c的最高位(因为c是从0开始的)
}
void Minus(bigint &a, bigint &b, bigint &c) {//减法
//if(a.len < a.len || (a.len == b.len && strcmp(stra ,strb) < 0)) //用strcmp判断 stra 与 strb 大小——若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
// 上面是考虑 为负的时候 不过要用string做
c.len = max(a.len ,b.len ) ;
for(int i = 0; i < c.len ; i++) {
c.num [i] = a.num [i] - b.num [i];
}
for(int i = 0; i < c.len ; i++) {
if(c.num [i] < 0) {
c.num [i] += 10;
c.num [i + 1] -= 1;
}
}
while(c.len > 1 && c.num [c.len - 1] == 0) c.len --;
}
/* 99 * 99 = 三位*/
/* 9 9 ---b[i]
* 9 9 ---a[j]
---------
8 9 1 ---c[i + j]
8 9 1
----------
9 8 0 1*/
void Multi(bigint &a, bigint &b, bigint &c) {//乘法
c.len = a.len + b.len ;
for(int i = 0 ; i < b.len ; ++i) {
for(int j = 0; j < a.len ; ++j) {
c.num[i + j] += a.num [j] * b.num [i];//防止被覆盖(如果用 c.num[i + j] = a.num[j] + b.num[i])
//如果数组的c[1]是第一位元素时,要写成 c.num[i + j - 1] += a.num [j] * b.num [i]
}
}
for(int i = 0; i < c.len ; i++) {
if(c.num [i] > 9) {
c.num [i + 1] += c.num [i] / 10;
c.num [i] %= 10;
}
}
while(c.num [c.len - 1] == 0 && c.len > 1) c.len--;//判断最高位(c.num[c.len - 1]) (在这是第四位,c.len - 1 = 3)上是不是0
//如果是,则将位数-- 并删去前导零
}
int main() {
read(a);
read(b);
// plue(a,b,c);//加
// Multi(a,b,c);//乘
Minus(a,b,c);//减
for(int i = c.len - 1; i >= 0 ; i--)//倒着输出
printf("%d",c.num [i]);
}
高精除法:
对于高精度除法,设置两个数组,(a / b) 可以先将b 数组加到a数组那么大(稍微小一点)(b如果乘10到了a的长度 , 那么可以理解成每一个,的权为10) 然后用a – b,减了几个b,c那一位上的数就是几,然后他们自乘以权,就得到c的最终结果;
最后再进位处理c;
(实际上我不会)