P8115 题解

· · 题解

P8115 题解

题目指标 Table.

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

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

正解

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

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

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

可以使用短除法:

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

s_1 \div 16= s_2 …… r_2,记录 r_2

接着 s_2 \div 16= s_3 …… r_3,记录 r_3

以此类推,直到 s_i=0 为止,有 r_1,r_2,r_3,……,r_{i-1}

B=\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("}");
}