TZOJ 3581: 最简IPv6表示
3581: 最简IPv6表示
Total Submit: 121 Accepted:18
Description
现在大家用的IP地址都是IPv4的,不过在不久的将来IPv6将要完全替代IPv4。IPv6的128位地址按每16位划分为一个位段,每个位段被转换为一个4位的16进制数,并用冒号“:”隔开,这种表示法称为冒号16进制表示法(colon hexadecimal)。如以下的IPv6地址:21DA:0000:0000:0000:02AA:000F:FE08:9C5A。不过这种表示方法不是很简洁,还可以通过以下的方法对IPv6地址进行简化:
1、压缩某个位段中的前导0来简化IPv6地址的表示。如上面的地址可以化简为21DA:0:0:0:2AA:F:FE08:9C5A。
2、有些类型的IPv6地址中包含了一长串0.为了进一步简化IP地址表达,在一个以冒号16进制法表示的IPv6地址中,如果几个连续位段的值都为0,那么这些0就可以简写为: :,称为双冒号表示法。那么,前面的结果又可以简化写为:21DA::2AA:F:FE08:9C5A。注意双冒号::在一个地址中只能出现一次。当出现多个可以用::表示的地方时,只对前面的用双冒号表示法。
Input
输入有多组数据以EOF结束。每组输入一个IPv6地址的完整表示。
Output
对于每组IPv6地址输出其最简的表示形式,每组输出占一行。如果输入的IPv6地址有错误,输出“It's not a IPv6 address!”。
Sample Input
21DA:0000:0000:0000:02AA:000F:FE08:9C5A
21DA:0103:0000:0000:02AA:000F:FE08:9C5A
21DZ:0000:0000:0000:02AA:000F:FE08:9C5A
Sample Output
21DA::2AA:F:FE08:9C5A
21DA:103::2AA:F:FE08:9C5A
It's not a IPv6 address!
Hint
注意输入输出的格式。
Source
搞下前缀中缀后缀的::就可以了
1 #include<stdio.h> 2 char s[88]; 3 int main() 4 { 5 while(~scanf("%s",s)) 6 { 7 int f=0; 8 //检查是否合法 9 for(int i=0; s[i]; i++) 10 if(!(s[i]>='0'&&s[i]<='9'||s[i]>='A'&&s[i]<='F'||i%5==4&&s[i]==':')) f=1; 11 if(f||strlen(s)!=39)printf("It's not a IPv6 address!\n"); 12 else 13 { 14 int a[9],f2=0; 15 //合法使用sscanf读入 16 sscanf(s,"%X:%X:%X:%X:%X:%X:%X:%X",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7]); 17 for(int i=0; i<8; i++) 18 { 19 if(a[i]==0&&!f) 20 { 21 int f1=0; 22 for(i=i+1; i<8; i++) 23 if(a[i]!=0)break; 24 else f1=1; 25 i--; 26 if(f1) 27 { 28 f=1; 29 if(!f2&&i==7)printf("::"); 30 else if(!f2||i==7)printf(":"); 31 } 32 else printf("0"); 33 } 34 else printf("%X",a[i]); 35 if(i==7)putchar(10); 36 else {putchar(':');f2=1;} 37 } 38 } 39 } 40 return 0; 41 }
本文来自博客园,作者:暴力都不会的蒟蒻,转载请注明原文链接:https://www.cnblogs.com/BobHuang/p/7805910.html