uva1590

12 篇文章 0 订阅
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int COMPARE(int a,int b,char str1[8],char str2[8]);
int CALCULATE_1(char str1[],char str2[]);
int CALCULATE_2(char str1[],char str2[],int sum1,int max);
int TO_END(int sum,int i,int max);
void OUTPUT_1(int a,int b);
void OUTPUT_2(int a,int b1,int b2);
void OUTPUT_3(int a,int b,int c1,int c2);
void OUTPUT_4(int a,int b,int c,int d1,int d2);
struct IP
{
    int x1,x2,x3,x4;
};
int main()
{
    struct IP min,max,temp;
    int i,N;
    while(scanf("%d",&N)!=EOF)
    {
            for(i=1;i<=N;i++)
        {
            if(i==1)
            {
                scanf("%d.%d.%d.%d",&temp.x1,&temp.x2,&temp.x3,&temp.x4);
                min = temp;max = temp;
            }
            else
            {
                scanf("%d.%d.%d.%d",&temp.x1,&temp.x2,&temp.x3,&temp.x4);
                if(temp.x1<min.x1)min = temp;
                if(temp.x1==min.x1&&temp.x2<min.x2)min = temp;
                if(temp.x1==min.x1&&temp.x2==min.x2&&temp.x3<min.x3)min = temp;
                if(temp.x1==min.x1&&temp.x2==min.x2&&temp.x3==min.x3&&temp.x4<min.x4)min = temp;
                if(temp.x1>max.x1)max = temp;
                if(temp.x1==max.x1&&temp.x2>max.x2)max = temp;
                if(temp.x1==max.x1&&temp.x2==max.x2&&temp.x3>max.x3)max = temp;
                if(temp.x1==max.x1&&temp.x2==max.x2&&temp.x3==max.x3&&temp.x4>max.x4)max = temp;
            }
        }
        if(min.x1!=max.x1)OUTPUT_1(min.x1,max.x1);
        else if(min.x1==max.x1&&min.x2!=max.x2)OUTPUT_2(min.x1,min.x2,max.x2);
        else if(min.x1==max.x1&&min.x2==max.x2&&min.x3!=max.x3)OUTPUT_3(min.x1,min.x2,min.x3,max.x3);
        else if(min.x1==max.x1&&min.x2==max.x2&&min.x3==max.x3&&min.x4!=max.x4)OUTPUT_4(min.x1,min.x2,min.x3,min.x4,max.x4);
        else {
            printf("%d.%d.%d.%d\n",min.x1,min.x2,min.x3,min.x4);
            printf("255.255.255.255\n");
        }
    }
    return 0;
}
int COMPARE(int a,int b,char str1[],char str2[])
{
    memset(str1,0,sizeof(str1));memset(str2,0,sizeof(str2));
    int i,x,sum=0;
    for(i=0;i<=7;i++)
    {
        x = (int)pow(2,7-i);
        if(sum+x<=a)
        {
            sum+=x;str1[i]='1';
        }
        else str1[i] = '0';
    }
    sum = 0;
    for(i=0;i<=7;i++)
    {
        x = (int)pow(2,7-i);
        if(sum+x<=b)
        {
            sum+=x;str2[i] = '1';
        }
        else str2[i] = '0';
    }
}
void OUTPUT_1(int min_x1,int max_x1)
{
    int sum1 = 0,sum2 = 0;
    char str1[8],str2[8];
    COMPARE(min_x1,max_x1,str1,str2);
    sum1 = CALCULATE_1(str1,str2);
    sum2 = CALCULATE_2(str1,str2,sum1,max_x1);
    printf("%d.0.0.0\n",sum1);
    printf("%d.0.0.0\n",sum2);
}
void OUTPUT_2(int min_x1,int min_x2,int max_x2)
{
    int sum1 = 0,sum2 = 0;
    char str1[8],str2[8];
    COMPARE(min_x2,max_x2,str1,str2);
    sum1 = CALCULATE_1(str1,str2);
    sum2 = CALCULATE_2(str1,str2,sum1,max_x2);
    printf("%d.%d.0.0\n",min_x1,sum1);
    printf("255.%d.0.0\n",sum2);
}
void OUTPUT_3(int min_x1,int min_x2,int min_x3,int max_x3)
{
    int sum1 = 0,sum2 = 0;
    char str1[8],str2[8];
    COMPARE(min_x3,max_x3,str1,str2);
    sum1 = CALCULATE_1(str1,str2);
    sum2 = CALCULATE_2(str1,str2,sum1,max_x3);
    printf("%d.%d.%d.0\n",min_x1,min_x2,sum1);
    printf("255.255.%d.0\n",sum2);
}
void OUTPUT_4(int min_x1,int min_x2,int min_x3,int min_x4,int max_x4)
{
    int sum1 = 0,sum2 = 0;
    char str1[8],str2[8];
    COMPARE(min_x4,max_x4,str1,str2);
    sum1 = CALCULATE_1(str1,str2);
    sum2 = CALCULATE_2(str1,str2,sum1,max_x4);
    printf("%d.%d.%d.%d\n",min_x1,min_x2,min_x3,sum1);
    printf("255.255.255.%d\n",sum2);
}
int CALCULATE_1(char str1[],char str2[])
{
    int i,sum = 0;
    for(i=0;i<=7;i++)
    {
        if(str1[i]==str2[i]&&str1[i]=='1')sum = pow(2,7-i) + sum;
        if(str1[i] != str2[i])return sum;
    }
}
int CALCULATE_2(char str1[],char str2[],int sum1,int max)
{
    int i,sum = 0;
    for(i=0;i<=7;i++)
    {
        if(str1[i]==str2[i])sum = (int)pow(2,7-i) + sum;
        if(str1[i] != str2[i])
        {
            if(TO_END(sum1,i,max))return (sum +(int)pow(2,7-i));
            return sum;
        }
    }
    return sum;
}
int TO_END(int sum,int i,int max)
{
    while(++i<=8) sum = (int)pow(2,7-i) + sum;
    if(sum<max)return 0;
    return 1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值