標籤(空格分隔): 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
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.0.1~255.0.0.0 —-a類
192.168.0.2~255.255.255.0 —-c類,私有
10.70.44.68~255.254.255.0—-錯誤的掩碼
19..0.~255.255.255.0—–錯誤的ip
可以得到統計資料如下:
1 0 1 0 0 2 1
huawei_test.cpp : 定義控制台應用程式的入口點。
#include
#include
#include
#define n 50
int convertsubiptoint(const
char* sub_ip)
return sub_value;
}bool isipaddressvalid(const
char* pszipaddr, int *subipvalue)
//去除後邊空格
while (pszipaddr[index_end] == ' ')
if (index_end <= index_start)
return
false;
int ip_length = index_end - index_start + 2;
char *temp_ip=(char*)malloc(ip_length);
strncpy(temp_ip, pszipaddr + index_start, ip_length-1);
temp_ip[ip_length - 1] = '\0';
char* sub_ip = strtok(temp_ip, ".");
int sub_ip_count = 0;
while (sub_ip != null)//ip分段,計數分段ip,並轉換為0-255
subipvalue[sub_ip_count - 1] = convertsubiptoint(sub_ip);
if (subipvalue[sub_ip_count - 1] < 0 || subipvalue[sub_ip_count - 1] > 255)
sub_ip = strtok(null, ".");
}free(temp_ip);
if (sub_ip_count != 4)
return
false;
else
return
true;
}bool isvalidmask(int* mask_value)
mask_int32 = ~mask_int32 + 1;
if ((mask_int32 & (mask_int32 - 1)) == 0)//判斷是否w為2^n次方
return
true;
else
return
false;
}bool isprivateip(int*ip_value)
bool ipanalyse(char* str, int* result)
if (!isvalidmask(sub_mask_value))
if (isprivateip(sub_ip_value))
result[6]++;
if (sub_ip_value[0] >= 1 && sub_ip_value[0] <= 126)//a類
if (sub_ip_value[0] >= 128 && sub_ip_value[0] <= 191)//b類
if (sub_ip_value[0] >= 192 && sub_ip_value[0] <= 223)//c類
if (sub_ip_value[0] >= 224 && sub_ip_value[0] <= 239)//d類
if (sub_ip_value[0] >= 240)//e類
return
false;
}int main()
; while (fgets(str, sizeof(str), stdin) != null)
for (size_t i = 0; i < 7; i++)
return
0;}
重點: 判斷子網掩碼的方法
下面給的例子是這樣的:先驗證是否為合法ip,然後將掩碼轉化成32無符號整型,取反為000…00111…1,然後再加1為00…01000…0,此時為2^n,如果滿足就為合法掩碼。
int issubnetmask(char* subnet)
return
0;
參見: 識別有效的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....