内存:128  时间:1

题目描述

    话说上次猴哥做梦梦到Z老师,Z老师紧接着就被来考查的专家抽中了说课,让Z老师好一顿忙活…
本来以为这只是个巧合,谁成想前几天猴哥又梦到了Z老师,这下可更坏了,Z老师实验室的路由器全瘫痪了.Z老师不干了,非让猴哥给他修路由器,机智的猴哥马上就诊断出是路由器的程序出了问题,可是他眼下要为学弟们准备假期计划,近几天抽不出时间重写路由器的程序。于是猴哥就发了email向你求助,并承诺搞定了这件大事就请你吃大餐~
    猴哥的email:(客套话省略2000字)…路由器中有一张路由表,表中是目的网络,子网掩码(如255.255.255.0),下一跳地址三项,给路由器发过来一个IP地址,如10.10.46.8,此IP地址的二进制形式(用“.”分隔的每一个十进制数转换为一个八位二进制数)为:00001010 00001010 00101110 00001000 ,用二进制的IP和二进制的子网掩码相与,得到的结果按每八位转换回十进制,就是IP对应的目的网络地址。请编程求给定IP与子网掩码对应的目的网络地址。
举个例子: IP: 00001010 00001010 00101110 00001000
         子网掩码: 11111111 11111111 11111111 00000000
                 ==   : 00001010 00001010 00101110 00000000
      十进制表示: 10       10       46       0
只修提交需要修改部分的代码,猴哥在此谢过~

#include <stdio.h>
unsigned char andoper(unsigned char c1,unsigned char c2)
{
    return c1&c2;
}
int main()
{
    int i,j,N,num;
    unsigned char ipaddr[4],netmask[4],netaddr[4];
    scanf("%d",&N);
    for(i=0; i<N; i++)
    {
        for(j=0; j<4; j++)
        {
            scanf("%d",&num);
            ipaddr[j]=num;
        }
        for(j=0; j<4; j++)
        {
            scanf("%d",&num);
            netmask[j]=num;
        }
/*****修改的起始行******/
        for(j=0; j<4; j++)
            netaddr[i] = andoper(ipaddr[j],netmask[j]);
        for(j=0; j<3; i++)
            printf("%d.",netaddr[j]);
        printf("%d
",netaddr[j]);
/*****修改的终止行*****/
    }
    return 0;
}

输入

首先输入一个数字N,代表用例的个数(n<100),接下来输入样例中第一行为四个十进制数(<=255)代表IP地址,第二行为四个十进制数(<=255)代表子网掩码,十进制数用空格分隔。

输出

输出用“.”分隔的十进制目的网络(如10.10.46.0)

样例输入

2
128 96 39 10
255 255 255 128

128 96 40 12
255 255 255 128

样例输出

128.96.39.0
128.96.40.0

提示

二进制与(&)运算,即1&1=1,1&0=0,0&1=0,0&0=0

代码如下

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 40
int bin1[MAX],bin2[MAX],bin3[MAX],k,len;
void dec_to_bin(int dec[],int bin[])
{
    //printf("%d %d %d %d ",dec[0],dec[1],dec[2],dec[3]);
    k=0,len=31;
    for(int i=3; i>=0; i--)
    {
        while(dec[i])
        {
            bin[len-k]=dec[i]%2;
            k++;
            dec[i]/=2;
        }
        len-=8;
        k=0;
    }
}
void bin_to_dec(int bin[])
{
    int sum=0,ok=0,tmp;
    for(int i=0; i<32; i++)
    {
        ok++;
        tmp=8-i%8;
        sum+=bin[i]*(int)(pow(2,tmp-1));
        if(ok%8==0)
        {
            printf("%d",sum);
            sum=0;
            if(ok!=32)
            {
                printf(".");
            }
        }
    }
    puts("");
}
int main()
{
    int i;
    int dec[4];
    int zdec[4];
    int N;
    scanf("%d",&N);
    while(N--)
    {
        memset(bin1,0,sizeof(bin1));
        memset(bin2,0,sizeof(bin2));
        for(i=0; i<4; i++)
            scanf("%d",&dec[i]);
        for(i=0; i<4; i++)
            scanf("%d",&zdec[i]);
        dec_to_bin(dec,bin1);
        dec_to_bin(zdec,bin2);
        for(i=0; i<32; i++)
        {
            bin3[i]=bin1[i]&bin2[i];
        }
        bin_to_dec(bin3);
    }
    return 0;
}

代码来源于互联网,仅供参考!