国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

算法競賽入門經(jīng)典 第二版 習(xí)題4-5 IP網(wǎng)絡(luò) IP Networks uva1590

2019-11-14 12:36:52
字體:
供稿:網(wǎng)友

題目:https://vjudge.net/PRoblem/UVA-1590

聽說這題用位運(yùn)算能大幅簡化,奈何我不會(huì)用。

思路:既然要找個(gè)最小范圍,自然要知道上限下限,找出最大的ip和最小的ip,然后轉(zhuǎn)換成二進(jìn)制,比對(duì)這兩個(gè)ip的二進(jìn)制,找出第一個(gè)不相同的位置。在這個(gè)位置之前的二進(jìn)制位最小的不變,最大的賦值為1;在這個(gè)位置之后的每個(gè)二進(jìn)制位(包括這個(gè)位置),將兩ip都賦值為0。再將處理后的這兩個(gè)ip轉(zhuǎn)換回十進(jìn)制。那么原來最小的ip就成了網(wǎng)絡(luò)地址(network address),原來最大的ip就成了子網(wǎng)掩碼(network mask)。

語言:c++

#include <cstdio>#include <iostream>#include <cctype>#include <cmath>#include <cstring>using namespace std;struct IP{ int ten[4];//保存十進(jìn)制形式 char two[4][8];//保存二進(jìn)制形式,用char類型只是為了省空間};bool isbigger(IP a, IP b)//定義IP大于的比較規(guī)則{ int i; for(i=0; i<4; i++) { if(a.ten[i]>b.ten[i]) { return true; } else if(a.ten[i]<b.ten[i]) { return false; } } return false;}bool issmaller(IP a, IP b)//定義IP小于的比較規(guī)則{ int i; for(i=0; i<4; i++) { if(a.ten[i]<b.ten[i]) { return true; } else if(a.ten[i]>b.ten[i]) { return false; } } return false;}void change(IP &a)//將十進(jìn)制轉(zhuǎn)換為二進(jìn)制{ int i, j, temp; memset(a.two, 0, sizeof(a.two)); for(i=0; i<4; i++) { temp = a.ten[i]; for(j=7; j>=0; j--) { if(temp==0) { break; } a.two[i][j] = temp % 2; temp /= 2; } }}void rechange(IP &a)//將二進(jìn)制轉(zhuǎn)換為十進(jìn)制{ memset(a.ten, 0, sizeof(a.ten)); int i, j; for(i=0; i<4; i++) { for(j=0; j<8; j++) { a.ten[i] *= 2; a.ten[i] += a.two[i][j]; } }}void check(IP &minn, IP &maxx)//比對(duì)處理函數(shù){ int i, j; bool t=false; for(i=0; i<4; i++) { for(j=0; j<8; j++) { if(t) { minn.two[i][j] = 0; maxx.two[i][j] = 0; } else { if(minn.two[i][j]!=maxx.two[i][j]) { t = true; minn.two[i][j] = 0; maxx.two[i][j] = 0; } else { maxx.two[i][j] = 1; } } } }}void print(IP a){ int i,j; printf("%d.%d.%d.%d/n", a.ten[0], a.ten[1], a.ten[2], a.ten[3]);}int main(){ IP temp, maxx, minn; int i, j, n; while(scanf("%d", &n)!=EOF) { for(i=0; i<n; i++) { for(j=0; j<4; j++) { scanf("%d%*c", &temp.ten[j]); } if(i==0) { maxx = temp; minn = temp; } else { if(isbigger(temp, maxx)) { maxx = temp; } if(issmaller(temp, minn)) { minn = temp; } } } change(minn); change(maxx); check(minn, maxx); rechange(minn); rechange(maxx); print(minn); print(maxx); } return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜丰县| 永善县| 大连市| 金坛市| 新和县| 泗水县| 增城市| 临武县| 恩施市| 革吉县| 邵阳市| 永顺县| 固镇县| 陇西县| 开封县| 巍山| 修水县| 沿河| 周宁县| 思茅市| 灵石县| 资溪县| 舒城县| 洛阳市| 永新县| 通河县| 彰武县| 诏安县| 遂川县| 靖宇县| 阳原县| 时尚| 新竹市| 青海省| 龙江县| 工布江达县| 城口县| 怀安县| 高邮市| 凭祥市| 东光县|