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 50000

int 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<=r
	if(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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐