hid sed || 超过 手工 输出格式 click 进制 而且
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;
- }
万能遥控器【解题报告】
hid sed || 超过 手工 输出格式 click 进制 而且
原文:http://www.cnblogs.com/Turkeyghb/p/7804691.html
来源: http://www.bubuko.com/infodetail-2385969.html