题意:输入m代表接下来的数据个数,计算接下来输入数据的网络掩码,和最小网络地址。
思路:
①子网掩码:先将数据转为二进制,判断从哪一位开始有数据不一样,记下下标index,
则子网掩码是index的前面是1,后面是0(2#),就是子网掩码,再转为10#输出;
②最小网络地址:用任意一个IP与子网掩码进行按位与运算得出最小IP,与运算的符号为&。
1 import java.util.Scanner;
2
3 public class UVA1590 {
4
5 public static void main(String[] args) {
6 Scanner scanner=new Scanner(System.in);
7 int m;
8 while(scanner.hasNext())
9 {
10 m=scanner.nextInt();
11 String[][] strTwo=new String[1000][4];//输入的数据存为二进制
12 StringBuffer[] stringBuffer=new StringBuffer[4];
13 int[] resCover=new int[4];//掩码结果 10#
14 int[] resMin=new int[4];//最小网络地址结果 10#
15 int [][] numTen = new int[1000][4];//输入的数据存为10进制
16 for(int i=0;i<m;i++)
17 {
18 String string=scanner.next();
19 String [] strTen=string.split("\\.");//"."有特殊含义,要加\\
20 int [] numTwo=new int[4];
21 for(int j=0;j<strTen.length;j++)
22 {
23 //ε=(´ο`*)))唉,不知道为什么我这么麻烦
24 numTen[i][j]=Integer.parseInt(strTen[j].toString());//string->int 10#
25 strTwo[i][j]=Integer.toBinaryString(numTen[i][j]);//10#->2#
26 numTwo[j]=Integer.parseInt(strTwo[i][j]);//string->int 2#
27 strTwo[i][j]=String.format("%08d", numTwo[j]);//2# 标准化,如果有1000->00001000
28 }
29 }
30 int index=32;//最左一个不同出现的地方的下标,他前面全是1,后面全是0(子网掩码)
31 boolean flag=true;
32 for(int j=0;j<4&&flag;j++)
33 {
34
35 for(int k=0;k<8&&flag;k++)
36 {
37 char ch=strTwo[0][j].charAt(k);
38 for(int l=0;l<m;l++)
39 {
40 if(strTwo[l][j].charAt(k)!=ch)
41 {
42 index=(j)*8+k;
43 flag=false;
44 break;
45 }
46 }
47 }
48 }
49 StringBuffer Cover=new StringBuffer();
50 StringBuffer[] strCover=new StringBuffer[4];
51 strCover[0]=new StringBuffer();
52 strCover[1]=new StringBuffer();
53 strCover[2]=new StringBuffer();
54 strCover[3]=new StringBuffer();
55 for(int j=0,n=0;j<32;j++)
56 {
57 if(j<index)
58 strCover[j/8].append('1');
59 else
60 strCover[j/8].append('0');
61 }
62 for(int j=0;j<4;j++)
63 {
64 resCover[j]=Integer.parseInt(strCover[j].toString(), 2);
65 }
66
67 int indexmin=0;//与掩码相与的下标
68
69 for(int j=0;j<4;j++)
70 {
71 int res=resCover[j]&numTen[indexmin][j];//任意一个子网与掩码相与,则为最小网络地址
72 resMin[j]=res;
73 }
74
75 for(int j=0;j<4;j++)
76 {
77 if(j!=0)
78 System.out.print(".");
79 System.out.print(resMin[j]);
80 }
81 System.out.print("\n");
82 for(int j=0;j<4;j++)
83 {
84 if(j!=0)
85 System.out.print(".");
86 System.out.print(resCover[j]);
87 }
88 System.out.print("\n");
89 }
90 }
91 }