vector<int>:存储
int
类型元素的动态数组。用于表示大整数的每一位数字。
vector
的大小是动态的,可以根据需要增加或减少元素的个数。还有
vector<double>
、vector<string>
等。
vector<int> v;
v.push_back(1); // 添加1到末尾
v.push_back(2); // 添加2到末尾
cout << v[0]; // 访问第一个元素,输出1
cout << v.size(); // 获取 vector 中的元素个数,输出2
v.pop_back(); // 删除末尾元素(2)
大整数包含过多数字,大整数的大小可能超过了int、long long 的表示范围,将大整数的数字拆开按位存储在两个vector<int>A和B中,逆序存储,最低位在前。
加法
vector<int> add(vector<int> &A,vector<int> &B)
{if(A.size()<B.size()) return add(B,A);//判断AB的长度,大的是Avector<int> C;int t=0;for(int i=0;i<A.size();i++)
{ t=t+A[i];//加上A的i位上的数字(以及进位数字)if(i<B.size()) t+=B[i];//加上B的第i位数字C.push_back(t%10);//将个位数字放入Ct/=10;//t转变为十位的数字,就是进位
}if(t) C.push_back(t);//如果最后进位有数,放入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(a[i]-'0');auto C =add(A,B);for(int i=C.size()-1;i>=0;i--) cout<<c[i];cout<<endl;return 0;
}
减法
1.cmp比较大小:
先比较A/B的长度,先不等长,若A.size() >B.size(),就是true。
再比较每一位数的大小,因为是逆序,倒着从最高位比较。i--。先判断两个数字不相等,A[i] != B[i]
,就返回 return A[i]>B[i];,是true。
如果没有找到不同的位(即两个数完全相等),返回 true
。
bool cmp(vector<int> &A,vector<int> &B){if(A.size()!=B.size())return A.size() >B.size();for(int i=A.size()-1;i>=0;i--)if(A[i]!=B[i])return A[i]>B[i];return true;}//2.sub函数:模拟大整数减法vector<int> sub(vector<int> &A,vector<int> &B){vector<int> C;int t = 0;for(int t=0;i<A.size();i++){t = A[i]-t;if(i<B.size()) t=t-B[i];C.push_back((t+10)%10);//t大于0,(t+10)%10等于t//t小于0,(t+10)%10等于t+10if(t<0) t=1;else t=0; }while(C.size()>1&&C.back()==0) C.pop_back();// 删除前导0//C.back() == 0 检查最末尾元素(倒序的)是否为零。如果是零,说明这个零是多余的前导零,需要删除。return C;}//3.主函数int main(){string a,b;cin>>a>>b;vector <int> A,B,C;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(cmp(A,B)){auto C = sub(A,B);for(int i=C.size()-1;i>=0;i--) cout<<C[i];}else{auto C=sub(B,A);cout<<"-";for(int i=C.size()-1;i>=0;i--) cout<<C[i];}return 0;}
乘法
输入:a是大数,b是小数
vector<int> mul(vector<int> &A,int b){vector<int> C;int t = 0;//t表示进位for(int i=0;i<A.size()||t;i++){
//t不是0就一起循环if(i<A.size()) t=t+A[i]*b;C.push_back(t%10);//将个位数字加入c的末端t/=10;//整除10是进位,去掉个位的数字
}
}
除法
虽然是倒序输入,但是除法是从最高位开始算。
vector<int> div(vector<int> &A, int b, int &r)
{vector<int> C; // 存储商的数组r = 0; // 初始化余数为 0for (int i = A.size() - 1; i >= 0; i--) // 从高位开始处理{r = r * 10 + A[i]; // 构建新的被除数C.push_back(r / b); // 计算当前位的商,加入到结果数组 //(r小于b,结果是0)r %= b; // 更新余数(除不尽的话,余数就是自己)}reverse(C.begin(), C.end()); // 结果是倒序的,反转过来while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除商中的前导零return C; // 返回商
}
-
初始化:
-
r = 0;
-
C = [];
-
-
第一次循环(
i = 9
,当前位是1
):-
r = r * 10 + A[9] = 0 * 10 + 1 = 1
(新的被除数是1
) -
C.push_back(r / 123) = 1 / 123 = 0
(商的当前位是0
) -
r = r % 123 = 1 % 123 = 1
(余数更新为1
)
-
-
第二次循环(
i = 8
,当前位是2
):-
r = r * 10 + A[8] = 1 * 10 + 2 = 12
(新的被除数是12
) -
C.push_back(r / 123) = 12 / 123 = 0
(商的当前位是0
) -
r = r % 123 = 12 % 123 = 12
(余数更新为12
)
-
-
第三次循环(
i = 7
,当前位是3
):-
r = r * 10 + A[7] = 12 * 10 + 3 = 123
(新的被除数是123
) -
C.push_back(r / 123) = 123 / 123 = 1
(商的当前位是1
) -
r = r % 123 = 123 % 123 = 0
(余数更新为0
)
-
-
第四次循环(
i = 6
,当前位是4
):-
r = r * 10 + A[6] = 0 * 10 + 4 = 4
(新的被除数是4
) -
C.push_back(r / 123) = 4 / 123 = 0
(商的当前位是0
) -
r = r % 123 = 4 % 123 = 4
(余数更新为4
)
-
-
继续循环:
-
后续的循环会按照相同的方式继续执行,直到处理完所有的位。
-