码迷,mamicode.com
首页 > 其他好文 > 详细

万能遥控器【解题报告】

时间:2017-11-08 17:36:31      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:tchar   表示法   log   空字符串   bsp   十六进制   定义   putchar   冒号   

【题目描述】

  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

 

代码如下,含义见注释

 

技术分享
#include<bits/stdc++.h>
using namespace std;
int n;
char p[11][6];
int main()
{
    freopen("remote.in","r",stdin);
    freopen("remote.out","w",stdout);
    scanf("%d",&n);
    int ans=0;
    while(n--){
        char s[101];
        scanf("%s",s);
        int len=strlen(s);
        int flag=0;
        for(int i=0;i<len;i++){
            if(s[i]!=:&&(!(s[i]<=9&&s[i]>=0))&&(!(s[i]>=A&&s[i]<=F))){
                flag=1;break;
            }
        }//非16进制 
        if(flag){
            printf("INVALID\n");
            continue;
        }
        int cnt1=0,cnt2=0;
        for(int i=0;i<len;i++){
            if(s[i]==:&&s[i+1]==:)cnt2++;
            if(s[i]==:)cnt1++;
        }
        if(cnt2>=2){
            printf("INVALID\n");
            continue;
        }
        if(!cnt2&&cnt1!=7){
            printf("INVALID\n");
            continue;
        }
        if(cnt2){//冒号数量不合法 
            if((s[0]==:&&s[1]==:)||(s[len-1]==:&&s[len-2]==:))
            cnt1--;
            if(cnt1>6){
                printf("INVALID\n");
                continue;
            }
        }
        if((s[0]==:&&s[1]!=:)||(s[len-1]==:&&s[len-2]!=:)){
            printf("INVALID\n");
            continue;
        }
        int last=-1,flag2=0;//数字个数不合法 
        for(int i=0;i<len;i++){
            if(s[i]==:){
                if(i-last-1>4){
                    flag2=1;
                    break;
                }
                last=i;
            }
        }
        if(flag2){
            printf("INVALID\n");
            continue;
        }
        memset(p,0,sizeof(p));//下面就是正常的转换了(已保证合法,随便摸拟) 
        int num=0;
        for(int i=0;i<len;){
            if(s[i]==:&&s[i+1]==:)break;
            if(s[i]==:)i++;
            int now=0;
            char tem[6];
            num++;
            while(s[i]!=:&&i<len){
                tem[++now]=s[i];
                i++;
            }
            int now2=4;
            for(int j=now;j>=1;j--){
                p[num][now2]=tem[j];
                now2--;
            }
        }
        if(num!=8){
            num=9;
            for(int i=len-1;i>=0;){
                if(s[i]==:&&s[i-1]==:)break;
                num--;
                if(s[i]==:)i--;
                int now=4;
                while(s[i]!=:&&i>=0){
                    p[num][now]=s[i];
                    now--;
                    i--;
                }
            }
        }
        for(int i=1;i<=8;i++){
            for(int j=1;j<=4;j++){
                printf("%c",p[i][j]);
            }
            if(i!=8)putchar(:);
        }
        putchar(\n);
    }
    return 0;
}
View Code

 

万能遥控器【解题报告】

标签:tchar   表示法   log   空字符串   bsp   十六进制   定义   putchar   冒号   

原文地址:http://www.cnblogs.com/Turkeyghb/p/7804691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!