1 条题解

  • 0
    @ 2025-8-24 22:36:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wimg6_
    1+1=?

    搬运于2025-08-24 22:36:09,当前版本为作者最后更新于2022-02-07 16:00:13,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    P8115 题解

    题目指标 Table.

    该文章同步发表于 我的博客 内。

    审核一经通过,他人不得盗用博客。若未通过,引用时需注明出处,并私信作者。

    正解

    读题。题意挺明确的,要你将十进制转换成十六进制。如果十六进制比十进制位数少两个及以上,则使用十六进制,否则使用十进制。

    进制转换非常容易,也就小学奥数的难度。如下所示:

    例:需使 (A)10=(B)16(A)_{10}=(B)_{16},求 BB 的值。

    可以使用短除法:

    首先 A÷16=s1r1A \div 16= s_1 …… r_1,记录 r1r_1

    s1÷16=s2r2s_1 \div 16= s_2 …… r_2,记录 r2r_2

    接着 s2÷16=s3r3s_2 \div 16= s_3 …… r_3,记录 r3r_3

    以此类推,直到 si=0s_i=0 为止,有 r1,r2,r3,,ri1r_1,r_2,r_3,……,r_{i-1}

    B=ri1 ri2r3 r2 r1B=\overline{r_{i-1}\ r_{i-2}……r_3\ r_2\ r_1}

    即可完成转化。

    代码

    这道题代码难点即在实现短除法以及进行比对。请读者依照以上分析与下列代码自行理解。

    同时需要注意,这道题的 long long 很大几率会炸掉,所以我一开始就选了 unsigned long long,但是完全没有必要使用高精度。

    以下是代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    unsigned long long n,f,p,q[1005];
    string s;
    char r;
    int main()
    {
        cin>>r;
        while(cin>>q[++n])
    		cin>>r;
        printf("{");
        for(int i=1;i<n;i++)
    	{
            s="",f=q[i],p=0;
            while(f) p++,f/=10;
            f=q[i];
            while(q[i])
    		{
                if(q[i]%16>9) s=char(q[i]%16-10+'A')+s;
                else s=char(q[i]%16+'0')+s;
                q[i]/=16;
            }
            s="0x"+s;
            if(s.size()<=p) cout<<s;
            else cout<<f;
            if(i<n-1) cout<<",";
        }
        return !printf("}");
    }
    
    • 1

    信息

    ID
    7399
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者