这个题的话,其实就是十进制二进制之间相互转换,控制坐标范围,这里的话,其实很麻烦的地方在于坐标控制,其中有两次我的错误是因为坐标控制的问题,但是整体的思路方面是很简单的,尽量设置变量在循环内的局部变量,防止变量太多。
#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;
} 
京公网安备 11010502036488号