請解析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。(例如:255.255.255.32就是乙個非法的掩碼)
本題暫時預設
以0開頭的ip位址是合法的,比如0.1.1.2,是合法位址
多行字串。每行乙個ip位址和掩碼,用~隔開。
統計a、b、c、d、e、錯誤ip位址或錯誤掩碼、私有ip的個數,之間以空格隔開。示例1
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 1
解題思路
本題的關鍵是如何判斷ip位址和掩碼的有效性。ip位址的有效性比較好判斷,只要由四個整數組成,並且每個整數在0-255之間即可。掩碼的有效性相對麻煩一些,根據題目的提示,合法的子網掩碼前面是連續的1,後面全是0。對此,需要注意以下幾點:
第一,子網掩碼是32位的,即由四個整數組成, 每個整數為8位,範圍咋0-255之間。
第二,全0和全1的子網掩碼都是非法的,即0.0.0.0和255.255.255.255是非法的。
第三,前面是連續的1,後面全是0。即最後乙個1的位置必須在第乙個0的位置前面。
為了判斷子網掩碼的合法性,必須先將子網掩碼表示成二進位制字串的形式。具體來說,先將子網掩碼以.為分隔提取四個子串,並將每個子串都轉化為二進位制字串。以最後的二進位制字串來判斷子網掩碼的合法性會比較方便。
完成了ip位址和子網掩碼的合法性判斷後,分類就比較簡單了。需要注意的是,乙個ip位址可能同時屬於私網ip和abcde中的某一類,也可能不屬於任何一種題目中給出的分類(比如0.255.36.47)。
最後,需要注意輸出格式。前面的各類ip位址以空格分開,最後乙個後面不要空格,直接換行,否則會出錯==
**
#include #include #include using namespace std;
void split(const string& str, string& str1, string& str2); //將str分成ip位址和掩碼,分別存入str1和str2
bool ismaskvalid(const string& str2); //判斷子網掩碼是否有效
bool isipvalid(const string& str1); //判斷ip位址是否有效
vectorsplit(const string& str); //將str以.為分隔
string transfertobinary(const vector& str); //將str中所有string轉化為乙個二進位制字串
string transfertobinary(const string& str); //將str轉化為二進位制字串
int typeofip(const string& str); //確認ip型別,1-5對應a-e,6-8對應三類私網ip, 9對應不屬於任何分類的合法分類
void print(const vector& count); //輸出統計結果
int main()
int type = typeofip(str1); //確認ip型別,1-5對應a-e,6-8對應三類私網ip,9對應不屬於任何分類的合法分類
if (type == 6 || type == 7 || type == 8)
else if (type >= 1 && type <= 5)
count[type - 1]++; //a-e類
}print(count); //輸出統計結果
return 0;
}void split(const string& str, string& str1, string& str2)
//將str分成ip位址和掩碼,分別存入str1和str2
bool ismaskvalid(const string& str) //判斷子網掩碼是否有效
if (all0 || all255) 與255.255.255.255無效
return 0;
string binarystr = transfertobinary(vecstr); //將str3轉化為二進位制字串
int index1 = binarystr.find('0'); //找到第乙個0的位置
int index2 = binarystr.find_last_of('1'); //找到最後乙個1的位置
if (index1 < index2) //第乙個0在最後乙個1之前
return 0;
return 1;
}bool isipvalid(const string& str) //判斷ip是否有效
return 1;
}vectorsplit(const string& str) //將str以.為分隔
vecstr.push_back(str.substr(begin, str.size() - begin)); //最後乙個子字串
return vecstr;
}string transfertobinary(const vector& vecstr) //將vecstr轉化為二進位制字串
return binstr;
}string transfertobinary(const string& str) //將str轉化為二進位制字串
return str2;
}int typeofip(const string& str) //確認ip型別,1-5對應a-e,6-8對應三類私網ip, 9對應無效ip
void print(const vector& count) //輸出統計結果
識別有效的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....
識別有效的IP位址和掩碼並進行分類統計
標籤 空格分隔 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 ...