// c = a - b,为了简单,规定a >= b,且都不小于零(没有负号,所以是纯数字) public List<Integer> add(List<Integer> a,List<Integer> b) { List<Integer> ans = newArrayList<>();//答案列表 intas= a.size(),bs = b.size(); inttemp=0,index = 0; while(index < as){// as >= bs temp = a.get(index) - temp;//借位 if (index < bs) temp -= b.get(index);// 相当于:temp = a.get(index) - b.get(index) - temp; ans.add((temp + 10) % 10);//无脑先向高位借10,取模10获取个位不管需不需要借位数据都不会出错 if (temp < 0) temp = 1;//需要借位,就让下次减的temp为1,表示借了位 else temp = 0;//要调整位0,避免多借几次位 } Collections.reverse(ans);//看情况需不需要翻转 return ans; }
高精度乘低精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// c = a * b, a >= 0, b >= 0 List<Integer> mul(List<Integer> a, int b) { List<Integer> ans = newArrayList<>();
inttemp=0; for (inti=0; i < a.size() || temp != 0; i ++ ) { if (i < a.size()) temp += a.get(i) * b; ans.add(temp % 10); temp /= 10; } // 可能还会需要去除高位的多余的0
return ans; }
高精度除低精度
其实一般高精度除非都会转换为 高精度 乘 被除数的逆元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// a / b = c ... r, A >= 0, b > 0 vector<int> div(vector<int> &A, int b, int &r) { vector<int> C; r = 0; for (int i = A.size() - 1; i >= 0; i -- ) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// a / b = c ... r, A >= 0, b > 0 public List<Integer> div(List<Integer> a,int b,int r){ List<Integer> ans = newArrayList<>(); r = 0; intindex= a.size() - 1; while(index >= 0){ r = r*10 + a.get(index); ans.add(r/b); r %= b; } Collections.reverse(ans); // 去除高位的0 //... return ans; }