UVA1590

这道题目思路还是比较简单的,但是其中有几个细节需要讨论一下:

先来说一下整体思路:

首先先将各个ip地址保存到一个ip[1000][32]的数组中,即保存成二进制的形式;具体的转换形式使用到了通用的一种转换方式,即每读取一位乘一次进制。

然后在输入的时候,每输入一个字符,就判断与之前是否相同,如果相同,那么mask就等于1,如果不同,那么mask就等于0.其实接下来的字符可以不用读了,但是在我的这个程序中还是读了,下次可以试试不读。

最后输出的时候,当遇到mask=1的时候,就输出此时的ip,当遇到mask=0的时候,就停止输出;

下面贴上代码

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;

char IP[1005][32];
char mask[32];
int num_ip;
int bype[4];//用来分别存储各个十进制数
string s;

void s_ten()
{
    memset(bype,0,sizeof(bype));
    for(int i=0,j=0;i<s.size();i++)
    {
        if(s[i]=='.')
        {
            j++;
            continue;
        }
        bype[j]=bype[j]*10+s[i]-'0';
    }
}
void print_mask()
{
    printf("mask是\n");
    for(int i=0;i<32;i++)
    {
        printf("%2d",mask[i]);
    }
    printf("\n\n");
}

void print_IP(int num)
{
    printf("第%d个IP是\n",num);
    for(int i=0;i<32;i++)
    {
        printf("%2d",IP[num][i]);
    }
    printf("\n\n");
}

void print_bype()
{
    for(int i=0;i<4;i++)
    {
        printf("%4d",bype[i]);
    }
    printf("\n");
}
bool read_ip()
{
    if(!(scanf("%d",&num_ip)==1))
    {
        return false;
    }
    memset(mask,1,sizeof(mask));
    for(int i=0;i<num_ip;i++)
    {
        cin>>s;
        s_ten();//将字符串转换成了四个十进制的数
//print_bype();
        int pos=0;
        for(int j=0;j<4;j++)//在这里转换成了二进制保存在IP中
        {
            for(int k=128;k>=1;k=k/2)
            {
//printf("%d  %d  %d\n",bype[j],k,bype[j]/k);
                IP[i][pos]=bype[j]/k;
                bype[j]=bype[j]%k;
                if(i&&mask[pos]&&IP[i-1][pos]!=IP[i][pos])//除了第一个不比较外,剩下的都需要比较
                {
                    mask[pos]=0;
                }
                pos++;
            }
        }
//print_mask();
//print_IP(i);
    }
    return true;
}
void print_ans()
{
    int flag=1;
    int A=0;
//print_IP(0);
    for(int i=0;i<32;i++)
    {
        if(mask[i]==0)
        {
            flag=0;
        }
        if(i&&i%8==0)
        {
            printf("%d.",A);
            A=0;
        }
        if(flag)
        {
        A=A*2+IP[0][i];
        }
        else
        {
            A=A*2;
        }
    }
    printf("%d\n",A);
    A=0;
    flag=1;
    for(int i=0;i<32;i++)
    {
        if(mask[i]==0)
        {
            flag=0;
        }
        if(i&&i%8==0)
        {
            printf("%d.",A);
            A=0;
        }
        if(flag)
        {
            A=A*2+1;
        }
        else
            A=A*2;
        
    }
    printf("%d\n",A);

}

int main()
{
#ifdef local
    freopen("input.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    while(read_ip())
    {    
        print_ans();
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/TorettoRui/p/10409625.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值