識別有效的IP位址和掩碼並進行分類統計

2022-08-15 16:48:16 字數 3713 閱讀 9466

在牛客網上,刷了這一題,並用牛客網提供的oj。總結了一些,程式設計中遇到的問題。

請解析ip位址和對應的掩碼,進行分類識別。要求按照a/b/c/d/e類位址歸類,不合法的位址和掩碼單獨歸類。

所有的ip位址劃分為 a,b,c,d,e五類

a類位址1.0.0.0~126.255.255.255; 

b類位址128.0.0.0~191.255.255.255; 

c類位址192.0.0.0~223.255.255.255;

d類位址224.0.0.0~239.255.255.255;

e類位址240.0.0.0~255.255.255.255

私網ip範圍是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

子網掩碼為前面是連續的1,然後全是0

輸入描述:

多行字串。每行乙個ip位址和掩碼,用~隔開。

輸出描述:

統計a、b、c、d、e、錯誤ip位址或錯誤掩碼、私有ip的個數,之間以空格隔開。

輸入例子:

10.70.44.68~255.254.255.0

1.0.0.1~255.0.0.0

192.168.0.2~255.255.255.0

19..0.~255.255.255.0

輸出例子:

1 0 1 0 0 2 1

本題的關鍵在於掩碼的檢查:

1、255.255.255.255,0.0.0.0不合法;

2、255.63.255.0,這種形式的,63是低位全1,後台**檢測時應該把高位去掉,所以這個是合法,

3、同理255.255.255.32,32是高位有0,低位也有0,所以合法,但是255.255.255.31,儘管高位有0被去掉而低位全1,因為高位0被去掉以後,剩下的就是全1了,這種情況就被當成第1種情況處理了,所以這個不合法。

4、注意255.0.0.32,不要在程式設計的時候把中間兩個省略掉,否則就會變成合法的了。

5、 a類位址1.0.0.0~126.255.255.255; 例如:0.98.251.80,不屬於a類的範圍,但是也不是錯誤的;大於255.255.255.255的ip不屬於任一類,但是格式上沒有錯誤。

這個是根據的我測試結果猜測的,可能有其他的原因,但是按照這個規律,用c語言來做是可以ac的,所以上面結論差不多正確。

1 #include 2 #include 3 #include 

4 #include 5

6using

namespace

std;78

int a_count = 0;9

int b_count = 0;10

int c_count = 0;11

int d_count = 0;12

int e_count = 0;13

int error_count = 0;14

int private_ip_count = 0;15

16int ip_tmp[4] = ;

1718

int ip_error(string

str)

1926

2728

for (int i = 0; i < 3; i++)

2934

if (str.find("

.") != str.npos) //

點分錯誤

3539 temp[3] =str;

4041

for (int i = 0; i < 4; i++) //

每段的位數錯誤

4248}49

for (int j = 0; j < 4; j++)

5058

else

5962}63

}64return0;

65}66int ip_area(int array0,int

array1)

6775}76

else

if (array0 == 127 && array1 >= 16 && array1 <= 31)77

80else

if (array0 >= 128 && array0 <= 191)81

84else

if (array0 >= 192 && array0 <= 223)85

91}92else

if (array0 >= 224 && array0 <= 239)93

96else

if (array0 >= 240 && array0 <= 255)97

100else

101105

return0;

106}

107int mark_error(string

str)

108;

112113

for (int i = 0; i < 3; i++)

114119

if (str.find("

.") != str.npos) //

點分錯誤

120124 temp[3] =str;

125126

for (int i = 0; i < 4; i++) //

每段的位數錯誤

127133

}134

for (int j = 0; j < 4; j++)

135143

else

144147

}148

}149

char flag = 0

;150

string

b;151

for (int j = 0; j < 4; j++)

152160

if (((tmp[j] >> i) & 1) == 0 && flag == 1

)161

164}

165if (flag == 0

)166

169else

170173

174}

175if (b.find('

0') != b.npos && b.find('

1') !=b.npos)

176182

}183

else

184188

return0;

189}

190int main(void

)191

209}

210//

cout << a_count << ' ' << b_count << ' ' << c_count << ' ' << d_count << ' ' << e_count << ' ' << error_count << ' ' << private_ip_count << endl;

211212

}213 cout << a_count << '

'<< b_count << '

'<< c_count << '

'<< d_count << '

'<< e_count << '

'<< error_count << '

'<< private_ip_count <214215

return0;

216 }

識別有效的IP位址和掩碼並進行分類

請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 c類位址192.0.0.0 2...

識別有效的IP位址和掩碼並進行分類統計

include include include include using namespace std static int result 7 儲存最後結果的陣列 string chang string str 轉換為二進位制 itoa num,tmp1,2 把num轉換為二進位制,並以字串形式儲存...

識別有效的IP位址和掩碼並進行分類統計

描述 請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 c類位址192.0.0....