目录
加法
减法
乘法
编辑
除法
加法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int n;
int a[N],b[N],c[N];
bool st[10];
void solve()
{
string sa,sb;
cin >> sa >> sb;
int la = sa.size(),lb = sb.size();
for(int i = la - 1,j = 1; i >= 0; i --, j ++)
{
a[j] = sa[i] - '0';
}
for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
{
b[j] = sb[i] - '0';
}
int lc = max(la,lb);
int st = 0;
int k = 1;
for(int i = 1; i <= lc; i ++, k ++)
{
c[k] = a[i] + b[i] + st;
if(c[k] >= 10)
{
st = 1;
c[k] = c[k] % 10;
}
else
{
st = 0;
}
}
if(st)
{
cout << st;
}
for(int i = k-1; i >= 1; i --)
{
cout << c[i];
}
// cout << k;
}
int main()
{
solve();
return 0;
}
https://www.luogu.com.cn/problem/P1601
模板
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
//为了方便计算,让A中保存较长的数字, B中保存较短的数字
if (A.size() < B.size()) return add(B, A);
//保存结果的数组
vector<int> C;
//进位,开始时是0
int t = 0;
//依次计算每一位
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];//加上 A 的第 i 位上的数字
if (i < B.size()) t += B[i];//加上 B 的第 i 位上的数字
C.push_back(t % 10); //C 中放入结果
t /= 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(b[i] - '0');//倒序存储第二个数
auto C = add(A, B);//调用加和函数
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];//倒序输出C中的数字
cout << endl;
return 0;
}
减法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int n;
int a[N],b[N],c[N];
bool st[10];
string sa,sb;
bool cmp(string x,string y)
{
if(x.size() != y.size()) return x.size() > y.size();
for(int i = 0; i < x.size(); i ++)
{
if(x[i] > y[i])
{
return true;
}
else if(x[i] < y[i]){
return false;
}
}
return false;
}
void solve()
{
string a1,b1;
cin >> a1 >> b1;
bool flag = false;
if(cmp(a1,b1))
{
sa = a1;
sb = b1;
flag = true;
}
else{
sa = b1,sb = a1;
}
int la = sa.size(),lb = sb.size();
for(int i = la - 1,j = 1; i >= 0; i --, j ++)
{
a[j] = sa[i] - '0';
}
for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
{
b[j] = sb[i] - '0';
}
int k = 1;
int st = 0;
for(int i = 1; i <= la; i ++,k ++)
{
c[k] = a[i] - b[i] - st;
if(c[k] < 0)
{
c[k] = a[i] + 10 - b[i] - st;
st = 1;
}
else st = 0;
}
while(1 && k)
{
if(!c[k-1]) k --;
else break;
}
if(!flag && k != 0) cout << "-";
for(int i = k-1; i >= 1; i --)
{
cout << c[i];
}
if(k == 0) cout << k;
}
int main()
{
solve();
return 0;
}
https://www.luogu.com.cn/record/159830019
乘法
//大数乘小数
#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int>&A,int b)
{
vector<int>C;
int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size())t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
return C;
}
int main()
{
string a;
int b;
cin>>a>>b;
if(b == 0){
cout << 0;
return 0;
}
vector<int>A;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
auto C=mul(A,b);
bool is_first = false;
for(int i=C.size()-1;i>=0;i--){
printf("%d",C[i]);
}
return 0;
}
//大数*大数
/*
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &A, vector<int> &B) {
vector<int> C(A.size() + B.size() + 7, 0); // 初始化为 0,C的size可以大一点
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < B.size(); j++)
C[i + j] += A[i] * B[j];
int t = 0;
for (int i = 0; i < C.size(); i++) { // i = C.size() - 1时 t 一定小于 10
t += C[i];
C[i] = t % 10;
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
return C;
}
int main() {
string a, b;
cin >> a >> b; // a = "1222323", b = "2323423423"
vector<int> 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');
auto C = mul(A, B);
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}
*/
https://www.luogu.com.cn/problem/P1303
除法
#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
using namespace std;
vector <ll> div(vector <ll> &A,ll b,ll &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数
vector <ll> C; // 答案
r = 0; // 余数
for(int i = A.size() - 1;i >= 0;i --){ // 从最高位开始处理
r = r * 10 + A[i]; // 上一次的余数乘10,再加上当前位上的数,就是被除数
C.push_back(r / b); // 往C里压入这个被除数除b
r %= b; // 计算余数
}
reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0
return C; // 返回答案
}
int main(){
string a;
long long b;
cin>>a>>b;
vector <ll> A;
for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i] - '0'); // 倒序
ll r;
auto C = div(A,b,r); // 答案
for(int i = C.size() - 1;i >= 0;i --) cout<<C[i];
return 0;
}
https://www.luogu.com.cn/problem/P1480