P9390题解

· · 题解

思路

这道题的思路就是暴力模拟,如果 y 的位数大于 z 那么把 y 补足 12 位输出即可,否则算出 zy 多出的那几位数,然后把这个数减一、者加一、不变得出三个数,放到 y 的前面,减去 z,然后取最小值例如 z123456123456y987654,那么 zy 多的部分就是 123456,分三种情况让这个数插到 y 前面,减一或者加一或着不变,那么就产生三个数 123455987654123457987654123456987654,接着把他们都补足 12 位,然后依次减去 z 取最小值即可,记得取绝对值,最后答案为 135802,转换成代码也是非常简单。

代码

#include<bits/stdc++.h>
using namespace std;

int wei(long long a)//取a的位数
{
    int cnt = 0;
    while(a > 0)
    {
        cnt++;
        a /= 10;
    }
    return cnt;
} 
long long qq(long long a, int t)//在a中取前t位
{
    int as = wei(a) - t;
    for(int i = 1; i <= as; i++)
    {
        a = a / 10;
    }
    return a;
}
long long qh(long long a, int t)//在a中取后t位
{
    int mo = 1;
    for(int i = 1; i <= t; i++)
    {
        mo *= 10;
    }
    return a % mo;
}
long long zero_num(int t)//范围10的t次方
{
    int mo = 1;
    for(int i = 1; i <= t; i++)
    {
        mo *= 10;
    }
    return mo;
}
int main()
{
    long long y, z;
    cin >> y >> z;
    y = abs(y);
    z = abs(z);
    int wy = wei(y), wz = wei(z), wc = wz - wy;
    if(wy > wz)
    {
        cout << (100000000000 + y) - z;
        return 0;
    }
    long long s = qq(z, wc), x1, x2, x3;
    x1 = abs((s * zero_num(wy)) + y);
    x2 = abs(((s - 1) * zero_num(wy)) + y);
    x3 = abs(((s + 1) * zero_num(wy)) + y);

    if(wei(x1) < 12)
    {
        x1 = abs((100000000000 + y) - z);//补足12位
    }
    else
    {
        x1 = abs(x1 - z);
    }
    if(wei(x2) < 12)
    {
        x2 = abs((100000000000 + y) - z);//补足12位
    }
    else
    {
        x2 = abs(x2 - z);
    }
    if(wei(x3) < 12)
    {
        x3 = abs((100000000000 + y) - z);//补足12位
    }
    else
    {
        x3 = abs(x3 - z);
    }
    if(x1 > x2)
    {
        swap(x1, x2);
    }
    if(x2 > x3)
    {
        swap(x2, x3);
    }
    if(x1 > x2)
    {
        swap(x1, x2);
    }
    cout << x1;
    return 0;
}