题目:给你一堆ip,求他们的最小网络地址和网络掩码
思路:找到最大的ip和最小的ip,把他们转化成二进制,从头到尾找二进制位相同的个数,最小网络地址把后面的不同的所有二进制变成0,网络掩码把前面的相同变成一
代码:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; struct node { char k[35]; } data[1005]; bool cmp(node a,node b) { if(strcmp(a.k,b.k)<0) return true; else return false; } void cut(char *str,int num) { int ans=0; int q=8; int flag=1; for(int i=0; i<strlen(str); i++) { if(str[i]!=‘.‘) { ans=ans*10+str[i]-‘0‘; } else { flag++; while(ans) { data[num].k[q]=ans%2+‘0‘; ans=ans/2; q--; } q=8*flag; ans=0; } } while(ans) { data[num].k[q]=ans%2+‘0‘; ans=ans/2; q--; } data[num].k[33]=‘\0‘; } int main() { int m; char k[35]; freopen("ip.in","r",stdin); freopen("ip.out","w",stdout); while(cin>>m) { for(int i=0; i<m; i++) { cin>>k; memset(data[i].k,‘0‘,sizeof(data[i].k)); cut(k,i); //cout<<data[i].k<<endl; } sort(data,data+m,cmp); int n=0; /*for(int i=0;i<m;i++) { cout<<data[i].k<<endl; }*/ for(int i=1; i<=32; i++) { if(data[0].k[i]==data[m-1].k[i]) { n++; } else break; } for(int i=n+1;i<=32;i++) { data[m-1].k[i]=‘0‘; } //cout<<data[m-1].k<<endl; int up=128; int ans=0; for(int i=1;i<=32;i++) { ans=ans+up*(data[m-1].k[i]-‘0‘); up=up/2; if(up==0) { cout<<ans; if(i!=32) cout<<‘.‘; up=128; ans=0; } } cout<<endl; for(int i=1;i<=n;i++) { data[m-1].k[i]=‘1‘; } ans=0; for(int i=1;i<=32;i++) { ans=ans+up*(data[m-1].k[i]-‘0‘); up=up/2; if(up==0) { cout<<ans; if(i!=32) cout<<‘.‘; up=128; ans=0; } } cout<<endl; } return 0; }
原文:http://www.cnblogs.com/simplekinght/p/6710659.html