UVa 1590 - IP Networks
生活随笔
收集整理的這篇文章主要介紹了
UVa 1590 - IP Networks
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
UVa 1590 - IP Networks
題意:
可以用一個網絡地址和一個子網掩碼描述一個子網(即連續的IP地址范圍)。其中子網掩碼包含32個二進制位,前32-n位為1,后n位為0,網絡地址的前32-n位任意,后n位為0。所有前32-n位和網絡地址的IP都屬于此網絡。題目要求輸入m個IP地址,求對應的網絡地址和子網掩碼。
解題思路:
用數組分別記錄輸入IP地址中的四位,排序后將最小值和最大值轉換成二進制,逐位比較即可得出相同位數n。
具體實現上我是寫了binary和decimal兩個函數來實現二進制和十進制的轉換,數組a,b,c,d分別存的是ip(min),ip(max),address,mask的二進制表示,對數組a,b進行逐位比對求出n。address的前32-n位和a相同,后n位為0;mask前32-n位為1,后n位為0,然后轉換成十進制輸出就好。
AC代碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; void binary(int a,int s[]); int decimal(int s[]); int main(void){ int n,i,t,address[4],mask[4],ip[4][1005],a[32],b[32],c[32],d[32]; while(~scanf("%d",&n)){for(i=0;i<n;i++)scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);for(i=0;i<4;i++) sort(ip[i],ip[i]+n);for(i=0;i<4;i++){binary(ip[i][0],a+8*i);binary(ip[i][n-1],b+8*i);}for(i=0;i<32;i++) if(a[i]!=b[i]) break;t=32-i;for(i=0;i<32;i++){if(i<32-t) {c[i]=a[i];d[i]=1;}else {c[i]=0;d[i]=0;}}for(i=0;i<4;i++) {address[i]=decimal(c+i*8);mask[i]=decimal(d+i*8);}printf("%d.%d.%d.%d\n",address[0],address[1],address[2],address[3]);printf("%d.%d.%d.%d\n",mask[0],mask[1],mask[2],mask[3]);}return 0; } void binary(int a,int s[]){ int i=7; while(a>0){s[i--]=a%2;a/=2; } if(i>=0){ for(;i>=0;i--) s[i]=0; } } int decimal(int s[]){ int i,n=0,t=1; for(i=7;i>=0;i--) {if(s[i]) n+=t;t*=2; } return n; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的UVa 1590 - IP Networks的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 进入/离开动画
- 下一篇: Linux下Sniffer程序的实现