1 条题解

  • 0
    @ 2025-8-24 22:21:23

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Utilokasteinn
    技不如人

    搬运于2025-08-24 22:21:23,当前版本为作者最后更新于2020-04-28 09:33:56,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    原本想写高精,写出来后,什么也输出不了。所以换了一个思路,代码很短,速度也挺快的。意思就是记录哪个数是5或6,最后再加上或减去,先附几个例子,自己先理解一下吧。

    a:  8279824   9589376   3344565   
    s1: 0000000   0100000   0000101
    s2: 0000000   0000001   0000010
    
    如果所在那一位是6,要达到最少,那一位就必须减去1
    如果所在那一位是5,要达到最多,那一位就必须加上1
    在程序中,定义一个s看现在算到了第几位
    而这个1的大小就是pow(10,s-1)
    最后在加上或减去就行了
    
    

    代码如下(实测31ms):

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int a,b,s1,s2;
        //s1代表最大与a+b相差的值,s2代表最小与a+香肠的值 
        cin>>a>>b;//输入a和b 
        for(int s=1,x=a;x;x/=10,s*=10)
        //s记录在哪一位是5或6,s每次都乘10 
        	if(x%10==5)s1+=s;//核心代码 
        	else if(x%10==6)s2+=s;
        for(int s=1,y=b;y;y/=10,s*=10)//同上 
        	if(y%10==5)s1+=s;
        	else if(y%10==6)s2+=s;
        cout<<a+b-s2<<" "<<a+b+s1;//输出最小和最大 
        return 0;//结束程序 
    }
    

    最后附上无注释代码,代码比其他题解都简洁很多:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int a,b,s1,s2;
        cin>>a>>b;
        for(int s=1,x=a;x;x/=10,s*=10)
        	if(x%10==5)s1+=s;
        	else if(x%10==6)s2+=s;
        for(int s=1,y=b;y;y/=10,s*=10)
        	if(y%10==5)s1+=s;
        	else if(y%10==6)s2+=s;
        cout<<a+b-s2<<" "<<a+b+s1;
        return 0;
    }
    

    谢谢观赏

    • 1

    信息

    ID
    5544
    时间
    1000ms
    内存
    32MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者