题解 P2815 【IPv6地址压缩】

· · 题解

这题很有趣啊!

首先,各位,16进制格式输入,了解一下。

scanf("%x",&a);
printf("%x",&a);

输入:00aa

输出:aa

轻松搞定去0问题!

你以为它就这点本事?它还可以连逗号什么的一起输入:

scanf("%x,%x",&a,&b);
printf("%x = %d",a+b,a+b);

输入:0008,109

输出:111 = 117

双冒号的事,楼下讲了!

参考代码(非AC,c与cpp通用)

#include<cstdio>
int main()
{
    int a[9]={1},b=0,s=8,l=0;
    scanf("%x:%x:%x:%x:%x:%x:%x:%x",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]);
    for(int i=8;i>=0;i--)
        if(a[i]==0)
            l++;
        else
        {
            if(l>b)
            {
                b=l;
                s=i;
            }
            l=0;
        }
    //printf("%d %d\n",s,b);
    for(int i=1;i<s;i++)
        printf("%x:",a[i]);
    if(s!=0)
        printf("%x",a[s]);
    if(s!=8)
    {
        printf("::");
    }
    for(int i=s+b+1;i<8;i++)
        printf("%x:",a[i]);
    if(s+b<8)
        printf("%x",a[8]);
    return 0;
}