这个题的话,其实就是十进制二进制之间相互转换,控制坐标范围,这里的话,其实很麻烦的地方在于坐标控制,其中有两次我的错误是因为坐标控制的问题,但是整体的思路方面是很简单的,尽量设置变量在循环内的局部变量,防止变量太多。
#include<iostream> #include<string.h> #include<math.h> using namespace std; //变量设的太多,转换和思路不麻烦,基本上就是暴力 string str; long long num; int b[60]; int main(){ while(cin>>str>>num){ //IP地址转换成十进制 //转换成二进制,再去把二进制换成十进制 memset(b,0,sizeof(b)); int count=1; for(int i=0;;){ //如果是数字,取出放进二进制数组 if(str[i]>='0'&&str[i]<='9'){ //生成数字 int tmp=0; do{ tmp=tmp*10+str[i]-'0'; i++; }while(str[i]>='0'&&str[i]<='9'); //转换成二进制 for(int j=count*8-1;tmp!=0;j--){ b[j]=tmp%2; tmp=tmp/2; } count++; } //如果已经结束 转换成十进制输出 if(str[i]=='\0'){ long long sum=0; for(int j=31;j>=0;j--){ sum+=b[j]*pow(2,31-j); } cout<<sum<<endl; break; } //如果是. 则加一继续往后判断 if(str[i]=='.'){ i++; } } //转成二进制再转换成ip地址 memset(b,0,sizeof(b)); //先转成二进制,逆序排列 for(int i=31;num!=0&&i>=0;i--){ b[i]=num%2; num=num/2; } for(int i=0;i<31;i=i+8){ int tmp=0; for(int j=i;j<i+8;j++){ tmp=tmp+b[j]*pow(2,8+(i-j)-1); } if(i%8==0&&i!=24){ cout<<tmp<<"."; }else{ cout<<tmp<<endl; } } } // 0 8 16 24 return 0; }