这个题的话,其实就是十进制二进制之间相互转换,控制坐标范围,这里的话,其实很麻烦的地方在于坐标控制,其中有两次我的错误是因为坐标控制的问题,但是整体的思路方面是很简单的,尽量设置变量在循环内的局部变量,防止变量太多。

#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;
}