ZOJ-2645

来源:互联网 发布:韩侂胄 知乎 编辑:程序博客网 时间:2024/05/16 18:51

本来挺简单一道题。。让我写的复杂无比,关键是中间还掉进了一个大坑!!!一个32位整数,如果移位大于等32位,那行为就是未定义的,而我天真地以为移位超过32位就变为0了,真是too simple。。WA的半死,说多了都是泪。。上代码吧

#include<stdio.h>#include<string.h>unsigned int ip_to_int(char *s){    unsigned int temp, res = 0;    char *t;    while ((t = strchr(s, '.')) != NULL)    {        temp = 0;        char *i;        for (i = s; i < t; i++)            temp = temp * 10 + *i - '0';        s = t + 1;        res = res * 256 + temp;    }    temp = 0;    for (t = s; *t != '\0'; t++)        temp = temp * 10 + *t - '0';    res = res * 256 + temp;    return res;}unsigned int index_of(unsigned int num, int index){    return (num >> (31 - index)) & 1u;}void int_to_ip(unsigned int num, char *s){    unsigned four = num % 256;    unsigned three = (num / 256) % 256;    unsigned two = (num / 256 / 256) % 256;    unsigned one = (num / 256 / 256 / 256) % 256;    sprintf(s, "%u.%u.%u.%u", one, two, three, four);}int main(){    int m;    unsigned int a[1000];    char s[20];    while (scanf("%d", &m) != EOF)    {        getchar();        int i, j;        for (i = 0; i < m; i++)        {            gets(s);            a[i] = ip_to_int(s);        }        int find = 0;        for (i = 0; i < 32; i++)        {            unsigned int bit = index_of(a[0], i);            for (j = 1; j < m; j++)                if (index_of(a[j], i) != bit)                {                    find = 1;                    break;                }            if (find)                break;        }        unsigned int mask = i ? (~0u >> (32 - i)) << (32 - i) : 0u;        //unsigned int mask = (~0u >> (32 - i)) << (32 - i); Wrong!!!!!        //mask value, important code!!!        int_to_ip(mask & a[0], s);        printf("%s\n", s);        int_to_ip(mask, s);        printf("%s\n", s);    }    return 0;}


0 0
原创粉丝点击