这道题目思路还是比较简单的,但是其中有几个细节需要讨论一下:
先来说一下整体思路:
首先先将各个ip地址保存到一个ip[1000][32]的数组中,即保存成二进制的形式;具体的转换形式使用到了通用的一种转换方式,即每读取一位乘一次进制。
然后在输入的时候,每输入一个字符,就判断与之前是否相同,如果相同,那么mask就等于1,如果不同,那么mask就等于0.其实接下来的字符可以不用读了,但是在我的这个程序中还是读了,下次可以试试不读。
最后输出的时候,当遇到mask=1的时候,就输出此时的ip,当遇到mask=0的时候,就停止输出;
下面贴上代码
#include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; char IP[1005][32]; char mask[32]; int num_ip; int bype[4];//用来分别存储各个十进制数 string s; void s_ten() { memset(bype,0,sizeof(bype)); for(int i=0,j=0;i<s.size();i++) { if(s[i]=='.') { j++; continue; } bype[j]=bype[j]*10+s[i]-'0'; } } void print_mask() { printf("mask是\n"); for(int i=0;i<32;i++) { printf("%2d",mask[i]); } printf("\n\n"); } void print_IP(int num) { printf("第%d个IP是\n",num); for(int i=0;i<32;i++) { printf("%2d",IP[num][i]); } printf("\n\n"); } void print_bype() { for(int i=0;i<4;i++) { printf("%4d",bype[i]); } printf("\n"); } bool read_ip() { if(!(scanf("%d",&num_ip)==1)) { return false; } memset(mask,1,sizeof(mask)); for(int i=0;i<num_ip;i++) { cin>>s; s_ten();//将字符串转换成了四个十进制的数 //print_bype(); int pos=0; for(int j=0;j<4;j++)//在这里转换成了二进制保存在IP中 { for(int k=128;k>=1;k=k/2) { //printf("%d %d %d\n",bype[j],k,bype[j]/k); IP[i][pos]=bype[j]/k; bype[j]=bype[j]%k; if(i&&mask[pos]&&IP[i-1][pos]!=IP[i][pos])//除了第一个不比较外,剩下的都需要比较 { mask[pos]=0; } pos++; } } //print_mask(); //print_IP(i); } return true; } void print_ans() { int flag=1; int A=0; //print_IP(0); for(int i=0;i<32;i++) { if(mask[i]==0) { flag=0; } if(i&&i%8==0) { printf("%d.",A); A=0; } if(flag) { A=A*2+IP[0][i]; } else { A=A*2; } } printf("%d\n",A); A=0; flag=1; for(int i=0;i<32;i++) { if(mask[i]==0) { flag=0; } if(i&&i%8==0) { printf("%d.",A); A=0; } if(flag) { A=A*2+1; } else A=A*2; } printf("%d\n",A); } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(read_ip()) { print_ans(); } return 0; }