目录
加法
减法
乘法
编辑
除法
加法
#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;//进位,开始时是0int 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 一定小于 10t += C[i];C[i] = t % 10;t /= 10;}while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0return 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里压入这个被除数除br %= b; // 计算余数}reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0return 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