算法習題---4-5IP網絡(Uva1590)

一:題目

給出m(1到10000之間)個IP地址,求他們最小的網絡號和子網掩碼

(一)樣例輸入

3          表示要獲取的IP地址個數
194.85.160.177  IP地址
194.85.160.183
194.85.160.178

(二)樣例輸出

194.85.160.176
255.255.255.248

二:代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define N 1000

int IP_Add[N][4],num;  //存放IP地址和個數

利用位移,與,或操做獲取子網掩碼

int getInterAddr()
{
    int i, j, n,m,len=0;
    for (i = 0; i < 4;i++)
        for (j = 1; j < num;j++)
            if (IP_Add[j][i] != IP_Add[j - 1][i])    //如果和上一個地址不一樣,則跳出
                goto Next;
Next:    //上面兩個for獲取的是IP相同的數據組,下面獲取不一樣組的相同位數
    n = m = IP_Add[j - 1][i];
    for (j = 1; j < num; j++)
        n &= IP_Add[j][i],m|=IP_Add[j][i];

    for (int k = 0; k < i; k++)    //開始打印部分網絡號
        printf("%d.", IP_Add[0][k]);
    //對n,m作右移操做,獲取完整網絡號
    while (n != m)    //比較n,m獲取相同位數
    {
        n >>= 1, m >>= 1;
        len++;    //len記錄的是不一樣位數
    }
    printf("%d\n", n<<=len);    //記得將n右移回去
    //獲取相同位數長度
    return i*8+8-len;
}

根據網絡號獲取的位數來獲取子網掩碼

void getSubAddr(int len)
{
    int n;
    for (int i = 0; i < len / 8; i++)
        printf("255.");
    n = 255 - ((int)pow(2.0, (double)(8 - len % 8)) - 1);
    printf("%d", n);
    for (int i = len / 8+1; i < 4; i++)
        printf(".0");
    printf("\n");
}

主函數

void main()
{
    FILE* fp = freopen("data5.in", "r", stdin);
    freopen("data5.out", "w", stdout);
    int l;    //記錄子網掩碼長度
    
    scanf("%d", &num);    //先讀取IP個數
    getchar();
    //再讀取全部IP
    for (int i = 0; i < num; i++)
    {
        scanf("%d.%d.%d.%d", &IP_Add[i][0], &IP_Add[i][1], &IP_Add[i][2], &IP_Add[i][3]);
        getchar();
    }

    //開始獲取網絡地址
    l = getInterAddr();
    //獲取子網掩碼
    getSubAddr(l);

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}

所有代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define N 1000

int IP_Add[N][4],num;

int getInterAddr()
{
    int i, j, n,m,len=0;
    for (i = 0; i < 4;i++)
        for (j = 1; j < num;j++)
            if (IP_Add[j][i] != IP_Add[j - 1][i])    //如果和上一個地址不一樣,則跳出
                goto Next;
Next:    //上面兩個for獲取的是IP相同的數據組,下面獲取不一樣組的相同位數
    n = m = IP_Add[j - 1][i];
    for (j = 1; j < num; j++)
        n &= IP_Add[j][i],m|=IP_Add[j][i];

    for (int k = 0; k < i; k++)    //開始打印部分網絡號
        printf("%d.", IP_Add[0][k]);
    //對n,m作右移操做,獲取完整網絡號
    while (n != m)    //比較n,m獲取相同位數
    {
        n >>= 1, m >>= 1;
        len++;    //len記錄的是不一樣位數
    }
    printf("%d\n", n<<=len);    //記得將n右移回去
    //獲取相同位數長度
    return i*8+8-len;
}

void getSubAddr(int len)
{
    int n;
    for (int i = 0; i < len / 8; i++)
        printf("255.");
    n = 255 - ((int)pow(2.0, (double)(8 - len % 8)) - 1);
    printf("%d", n);
    for (int i = len / 8+1; i < 4; i++)
        printf(".0");
    printf("\n");
}

void main()
{
    FILE* fp = freopen("data5.in", "r", stdin);
    freopen("data5.out", "w", stdout);
    int l;    //記錄子網掩碼長度
    
    scanf("%d", &num);    //先讀取IP個數
    getchar();
    //再讀取全部IP
    for (int i = 0; i < num; i++)
    {
        scanf("%d.%d.%d.%d", &IP_Add[i][0], &IP_Add[i][1], &IP_Add[i][2], &IP_Add[i][3]);
        getchar();
    }

    //開始獲取網絡地址
    l = getInterAddr();
    //獲取子網掩碼
    getSubAddr(l);

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}
所有代碼
相關文章
相關標籤/搜索