高精度

高精度加法

高精度加法采用数组的形式进行存储和运算,数组a[0]存储个位数,a[1]存储十位数

int Add(int a[], int b[], int c[], int cnt) {

int t = 0;//t表示进位

for (int i=1; i<=cnt; i++) {
t += a[i] + b[i];//进位加上a和b第i位上的数
c[i] = t % 10;//c的值就是进位的个位数
t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
}
if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上

return cnt;
}

int main() {

string a, b;
cin >> a >> b;


//A和B倒着放进int数组,因为有进位,倒着放容易处理
int cnt1 = 0;
for (int i=a.size()-1; i>=0; i--)
A[++cnt1] = a[i] - '0';

int cnt2 = 0;
for (int i=b.size()-1; i>=0; i--)
B[++cnt2] = b[i] - '0';

int tot = Add(A, B, C, max(cnt1, cnt2));

//因为A和B是倒着放的,所以C也要倒着输出
for (int i=tot; i>=1; i--)
cout << C[i];
}

 

高精度减法

对于 t = A[i] - B[i] - t; 可以拆为 t = A[i] - t如果B[i]合法,再t -= B[i] 这么两步来做
相减后t的处理 ,把 t >=0 和 t < 0 用一个式子来表示 t = (t + 10) % 10 这个木有想到

vector <int> sub(vector<int>& A, vector<int> &B)
{
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i++)
{
t = A[i] - t;
if(i < B.size()) t -= B[i];
C.push_back((t + 10) % 10 ); // 合而为1
if(t < 0) t = 1;
else t = 0;

}

while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导0

return C;
}

int main()
{
string a ,b;
vector<int> A, B;

cin >> a >> b ;

for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

if (a.size() < b.size())
{
auto C = sub(B, A);
printf("-");
for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}


if (a.size() == b.size())
{
for(int i = a.size() -1 ; i >= 0; i --)
if(A[i] != B[i])
{
if(A[i] < B[i])
{
auto C = sub(B, A);
printf("-");
for(int j = C.size() - 1; j >= 0; j--) printf("%d", C[j]);
return 0;
}
else
{
auto C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}
}
}

auto C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);

return 0;
}

 

高精度乘法

C=(3*12)%10  个位

t=(3*12)/10     进位

高精度除法

r*10+A 余数

posted @ 2022-10-09 12:27  YUI唯  阅读(188)  评论(0)    收藏  举报