給出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); }