万能遥控器【解题报告】

【题目描述】

  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

 

代码如下,含义见注释

 

  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 }
View Code

 

转载于:https://www.cnblogs.com/hyghb/p/7804691.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值