题解 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;
}