1. A+B Problem(高精)

洛谷–算法题-编程之家

Code:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <vector>using namespace std;
int main() {string a,b;vector<int>res;cin>>a>>b;reverse(a.begin(),a.end());reverse(b.begin(),b.end());int t = 0;for (int i = 0; i < a.size() || i < b.size(); ++i) {if (i < a.size()) t += a[i] - '0';if (i < b.size()) t += b[i] - '0';res.push_back(t % 10);t /= 10;}if (t) res.push_back(1);for (int i = res.size() - 1; i >= 0; --i) {cout<<res[i];}
}

Note:

  1. 由于输入的数字范围过大,必须要用字符串输入数字,输入之后为个位开始计算,利用reverse函数使字符串倒置。
  2. 然后对a和b上的每一位数字从小到大相加,注意循环的前面定义了一个 t,用来保存进位的值。
  3. 只要将每一个数字字符减去‘0’即可得到整型值。
  4. 注意循环结束之后还有一个t需要判断是否要进位。

2. A*B Problem

洛谷–算法题-编程之家

Code:

#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 50000int m[MAXN], n[MAXN], t[MAXN];void multip(string x, string y) {int lenx = x.size();int leny = y.size();int len = lenx + leny;for (int i=0; i<lenx; ++i)m[i] = x[lenx-i-1] - '0';for (int i=0; i<leny; ++i)n[i] = y[leny-i-1] - '0';for (int i=0; i<lenx; ++i)for (int j=0; j<leny; ++j)t[i+j] += m[i] * n[j];for (int i=0; i<len; ++i)if (t[i] > 9) {t[i+1] += t[i] / 10;t[i] %= 10;}while (t[len-1] == 0 && len > 1)--len;for (int i=len-1; i>=0; --i)cout << t[i];
}int main() {string a, b;cin >> a >> b;multip(a, b);cout << endl;return 0;
}

Note:

  1. 关键在于:
for (int i=0; i<lenx; ++i)for (int j=0; j<leny; ++j)t[i+j] += m[i] * n[j];

3. 求第 k 小的数

洛谷–算法题-编程之家

Code:

#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
void qsort(int l,int r)
{int i=l,j=r,mid=x[(l+r)/2];do{while(x[j]>mid)j--;while(x[i]<mid)i++;if(i<=j){swap(x[i],x[j]);i++;j--;}}while(i<=j);//快排后数组被划分为三块: l<=j<=i<=rif(k<=j) qsort(l,j);//在左区间只需要搜左区间else if(i<=k) qsort(i,r);//在右区间只需要搜右区间else //如果在中间区间直接输出{printf("%d",x[j+1]);exit(0);}
}
int main()
{int n;scanf("%d%d",&n,&k);for(int i=0;i<n;i++)scanf("%d",&x[i]);qsort(0,n-1);
}

Note