题目
计算S = a + (k + a) + (2k + a) + … + (n * k + a);
完整解法
在这道题中我们要考虑到一件事:a,k,n的大小并不清楚,仅仅知道全部为int类型,而int的大小约为2^32。在计算的过程中当a,k,n等数过大时有可能会出现计算出的值超出int的范围而遭成
#include <iostream>
#include <vector>
using namespace std;
vector<int> multiplication(vector<int> &a,vector<int> &b){//乘法
int tmp = 0;//进位情况
vector<int> ret;
for (int i = 0; i < a.size(); i++){
for (int j = 0; j < b.size(); j++){
if (i + j < ret.size()){
ret[i + j] = a[i] * b[j] + ret[i + j] + tmp;
}
else{
ret.push_back(a[i] * b[j] + tmp);
}
if (ret[i + j] >= 10){
tmp = ret[i + j] / 10;
ret[i + j] = ret[i + j] % 10;
}
else{
tmp = 0;
}
}
if (tmp != 0){
ret.push_back(tmp);
tmp = 0;
}
}
if (tmp != 0){
ret.push_back(tmp);
}
return ret;
}
vector<int> division(vector<int> &nums, int a){//除法
int tmp = 0;
for (int i = nums.size() - 1; i >= 0; i--){
int p = nums[i] + tmp;
nums[i] = p / 2;
tmp = (p % 2) * 10;
}
return nums;
}
void vectorShow(vector<int> &nums){//展示
for (int i = nums.size() - 1; i >= 0; i--){
if (i == nums.size() - 1 && nums[i] == 0){ continue; }
cout << nums[i];
}
}
vector<int> transport(int num){//数字与矩阵的转换
vector<int> tmp;
while (num != 0){
tmp.push_back(num % 10);
num = num / 10;
}
return tmp;
}
vector<int> addition(vector<int> &a, vector<int> &b){
int l_a = a.size();//a的长度
int l_b = b.size();//b的长度
int i = 0;//加法的指针
int tmp = 0;//进位情况
vector<int> ret;//结果
while (i < l_a && i < l_b){
ret.push_back(a[i] + b[i] + tmp);
if (ret[i] >= 10){
tmp = ret[i] / 10;
ret[i] = ret[i] % 10;
}
else{
tmp = 0;
}
i++;
}
ret.push_back(tmp);
if (i >= l_a && i >= l_b){ return ret; }
else if (i < l_a && i >= l_b){//a没有加完的情况
ret[i] = ret[i] + a[i];
i++;
while (i < l_a){
ret.push_back(a[i]);
i++;
}
}
else if(i < l_b && i >= l_a){//b没有加完的情况下
ret[i] = ret[i] + b[i];
i++;
while (i < l_b){
ret.push_back(b[i]);
i++;
}
}
return ret;
}
int main(){
int a, n, k;
cin >> a >> n >> k;
vector<int> v_a = transport(a);
vector<int> v_n = transport(n);
vector<int> v_n_1 = transport(n + 1);
vector<int> v_k = transport(k);
vector<int> sum_1 = division(multiplication(multiplication(v_n,v_n_1),v_k),2);//k的和
vector<int> sum_2 = multiplication(v_n_1, v_a);//a的和
vector<int> sum = addition(sum_1, sum_2);
vectorShow(sum);
cout << endl;
return 0;
}
各个函数
函数1——数组乘法:
vector<int> multiplication(vector<int> &a,vector<int> &b){//乘法
int tmp = 0;//进位情况
vector<int> ret;
for (int i = 0; i < a.size(); i++){
for (int j = 0; j < b.size(); j++){
if (i + j < ret.size()){
ret[i + j] = a[i] * b[j] + ret[i + j] + tmp;
}
else{
ret.push_back(a[i] * b[j] + tmp);
}
if (ret[i + j] >= 10){
tmp = ret[i + j] / 10;
ret[i + j] = ret[i + j] % 10;
}
else{
tmp = 0;
}
}
if (tmp != 0){
ret.push_back(tmp);
tmp = 0;
}
}
if (tmp != 0){
ret.push_back(tmp);
}
return ret;
}
函数2——数组除以整数:
vector<int> division(vector<int> &nums, int a){//除法
int tmp = 0;
for (int i = nums.size() - 1; i >= 0; i--){
int p = nums[i] + tmp;
nums[i] = p / 2;
tmp = (p % 2) * 10;
}
return nums;
}
函数3——数组加法:
vector<int> addition(vector<int> &a, vector<int> &b){
int l_a = a.size();//a的长度
int l_b = b.size();//b的长度
int i = 0;//加法的指针
int tmp = 0;//进位情况
vector<int> ret;//结果
while (i < l_a && i < l_b){
ret.push_back(a[i] + b[i] + tmp);
if (ret[i] >= 10){
tmp = ret[i] / 10;
ret[i] = ret[i] % 10;
}
else{
tmp = 0;
}
i++;
}
ret.push_back(tmp);
if (i >= l_a && i >= l_b){ return ret; }
else if (i < l_a && i >= l_b){//a没有加完的情况
ret[i] = ret[i] + a[i];
i++;
while (i < l_a){
ret.push_back(a[i]);
i++;
}
}
else if(i < l_b && i >= l_a){//b没有加完的情况下
ret[i] = ret[i] + b[i];
i++;
while (i < l_b){
ret.push_back(b[i]);
i++;
}
}
return ret;
}