【题目描述】
Z镇的恒恒有着各种各样的机器人。为了控制所有的机器人,恒恒托别人造了一个万能遥控器。只要向遥控器输入一个机器人的编号,就能遥控这个机器人。可 是有一天,恒恒发现他的机器人实在太多了(而且越来越多),以至于使用IPV4协议都不够唯一地标记每个机器人。后来,恒恒听说IPV6协议拥有近无穷个 地址,于是他就想用IPV6协议来为机器人编号。不过,完整的IPV6地址很长(有39个字符),手工输入很费时间,所以IPV6有一套简化的机制。现 在,恒恒给了你一些IPV6地址,请你编写程序,将它们转换为完整的地址吧!
IPV6的地址定义如下:
IPV6的地址有128位,以16位为一分组,每个16位分组写成4个十六进制数,中间用冒号分隔,称为冒号分十六进制格式。
例如:21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A是一个完整的IPV6地址。
IPV6地址中每个16位分组中的前导零位可以去除做简化表示,但每个分组必须至少保留一位数字。如上例中的地址,去除前导零位后可写成
21DA:D3:0:2F3B:2AA:FF:FE28:9C5A
某些地址中可能包含很长的零序列,为进一步简化表示法,还可以将冒号十六进制格式中的相邻的连续零位合并,用双冒号“::”表示。“::”符号在一个地址 中只能出现一次,该符号也能用来压缩地址中前部和尾部相邻的连续零位,例如地址 1080:0:0:0:8:800:200C:417A,0:0:0:0:0:0:0:1,0:0:0:0:0:0:0:0分别可表示为压缩格式 1080::8:800:200C:417A,::1,::。
【输入格式】
第1行为一个正整数n,表示接下来将有n个地址。
将下来有n行,每行一个非空字符串,表示一个地址。
【输出格式】
一共n行,每行一个字符串。对每个输入的字符串,如果符合IPV6标准,则输出其对应的完整的IPV6地址,否则,输出INVALID。
【样例输入】
4 1080::8:800:200C:417A ::1 :: 1234567890ABCDEF
【样例输出】
1080:0000:0000:0000:0008:0800:200C:417A 0000:0000:0000:0000:0000:0000:0000:0001 0000:0000:0000:0000:0000:0000:0000:0000 INVALID
【提示】
输入和输出文件只包含数字、大写字母、冒号(:英文的)和换行符。输入每行不超过39个字符。
考试的t1,没有别的算法,就是模拟,但是细节蛮多的。
反正我考场只拿了20
代码如下,含义见注释
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 char p[11][6]; 5 int main() 6 { 7 scanf("%d",&n); 8 int ans=0; 9 while(n--){ 10 char s[101]; 11 scanf("%s",s); 12 int len=strlen(s); 13 int flag=0; 14 for(int i=0;i<len;i++){ 15 if(s[i]!=':'&&(!(s[i]<='9'&&s[i]>='0'))&&(!(s[i]>='A'&&s[i]<='F'))){ 16 flag=1;break; 17 } 18 }//非16进制 19 if(flag){ 20 printf("INVALID\n"); 21 continue; 22 } 23 int cnt1=0,cnt2=0; 24 for(int i=0;i<len;i++){ 25 if(s[i]==':'&&s[i+1]==':')cnt2++; 26 if(s[i]==':')cnt1++; 27 } 28 if(cnt2>=2){ 29 printf("INVALID\n"); 30 continue; 31 } 32 if(!cnt2&&cnt1!=7){ 33 printf("INVALID\n"); 34 continue; 35 } 36 if(cnt2){//冒号数量不合法 37 if((s[0]==':'&&s[1]==':')||(s[len-1]==':'&&s[len-2]==':')) 38 cnt1--; 39 if(cnt1>6){ 40 printf("INVALID\n"); 41 continue; 42 } 43 } 44 if((s[0]==':'&&s[1]!=':')||(s[len-1]==':'&&s[len-2]!=':')){ 45 printf("INVALID\n"); 46 continue; 47 } 48 int last=-1,flag2=0;//数字个数不合法 49 for(int i=0;i<len;i++){ 50 if(s[i]==':'){ 51 if(i-last-1>4){ 52 flag2=1; 53 break; 54 } 55 last=i; 56 } 57 } 58 if(flag2){ 59 printf("INVALID\n"); 60 continue; 61 } 62 memset(p,'0',sizeof(p)); 63 int num=0; 64 for(int i=0;i<len;){ 65 if(s[i]==':'&&s[i+1]==':')break; 66 if(s[i]==':')i++; 67 int now=0; 68 char tem[6]; 69 num++; 70 while(s[i]!=':'&&i<len){ 71 tem[++now]=s[i]; 72 i++; 73 } 74 int now2=4; 75 for(int j=now;j>=1;j--){ 76 p[num][now2]=tem[j]; 77 now2--; 78 } 79 } 80 if(num!=8){ 81 num=9; 82 for(int i=len-1;i>=0;){ 83 if(s[i]==':'&&s[i-1]==':')break; 84 num--; 85 if(s[i]==':')i--; 86 int now=4; 87 while(s[i]!=':'&&i>=0){ 88 p[num][now]=s[i]; 89 now--; 90 i--; 91 } 92 } 93 } 94 for(int i=1;i<=8;i++){ 95 for(int j=1;j<=4;j++){ 96 printf("%c",p[i][j]); 97 } 98 if(i!=8)putchar(':'); 99 } 100 putchar('\n'); 101 } 102 return 0; 103 }