vector<int> add(vector<int>& A, vector<int>& B)//这边使用&(引用)是为了提高效率,如果不加的话会把整个数组拷贝进来 { vector<int> C;//定义答案c
int t = 0;//用t记录进位 for (int i = 0; i < A.size() || i < B.size(); i++) { if (i < A.size()) t += A[i]; if (i < B.size()) t += B[i];//完成t=A[i]+B[i] C.push_back(t % 10);//取余 t /= 10;//进位,t大于10就会变成1,即进一 }
if (t) C.push_back(1);//在数组的最后添加一位,数据为1 return C; }
intmain() { string a, b;//因为太长了,所以用字符串读进来 vector<int>A, B;//把a,b存到这里
cin >> a >> b;//a="123456" for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');//A=[6,5,4,3,2,1],因为要逆着存,所以逆着遍历 for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - '0');//b[i]输出的是字符(ascII码值) //再减去0的ascII值就能转变成正常的数字输出 auto C = add(A, B);
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];//按照我们读写习惯,应该先输出最高位,而最高位存在数组的的最后一位 return0; }
//判断是否有A>=B boolcmp(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];//找到第一位不相等的数,A的数比较大就A大,反之也是一样 returntrue;//如果A=B,也返回真值 }
vector<int> sub(vector<int> &A, vector<int> &B) { vector<int> C;//定义答案c for (int i = 0, t = 0; i < A.size(); i++) { //定义t为进位 t = A[i] - t;//实际上是t = A[i] - B[i] - t if (i < B.size()) t -= B[i];//但是B需要做要做判断,判断是否有这一位数 C.push_back((t + 10) % 10);//如果t>=0,则返回t本身,如果t<0,则返回t+10 if (t < 0) t = 1; else t = 0; } while (C.size() > 1 && C.back() == 0) C.pop_back(); //例如123-120=003,这里的pop_back()能从最后数组一位删除数据 //如果答案C只有一位,且答案为0,则不能删去0 return C; }
intmain() { string a, b;//因为太长了,所以用字符串读进来 vector<int>A, B;//把a,b存到这里
cin >> a >> b;//a="123456" for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');//A=[6,5,4,3,2,1],因为要逆着存,所以逆着遍历 for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - '0');//b[i]输出的是字符(ascII码值) //再减去0的ascII值就能转变成正常的数字输出 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];//按照我们读写习惯,应该先输出最高位,而最高位存在数组的的最后一位 } return0; }
vector<int> mul(vector<int> &A, int b) { vector<int> C;//定义答案C int t=0;//进位 for (int i = 0; i < A.size() || t; i++)//A没处理完或者进位没处理完 { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10;//进位 } while (C.size() > 1 && C.back() == 0) C.pop_back();//处理前导0 //例如123-120=003,这里的pop_back()能从最后数组一位删除数据 //如果答案C只有一位,且答案为0,则不能删去0 return C; }
intmain() {
string a; int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
auto C = mul(A, b);
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
voidinsert(int l, int r, int c)//范围是[l.r],在里面+c { b[l] += c; b[r + 1] -= c; } //让数组b在b[l]处+c,在b[r+1]处—c,从而保证在[l,r]内,每个a都能+c
intmain() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; //读入数据
for (int i = 1; i <= n; i++) insert(i, i, a[i]); //假设初始的时候a全是0,通过插入函数让它分别等于a[1]...a[i] //在[i,i]内,做a[i]+=c,a[i+1]-=c //也就是让a数组的值变成a[1]...a[i] while (m--)//m个操作 { int l, r, c; cin >> l >> r >> c; insert(l, r, c); }
for (int i = 1; i <= n; i++) b[i] += b[i - 1];//把b数组变成自己的前缀和