在牛客網上,刷了這一題,並用牛客網提供的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.01.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 11、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 #include4 #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....