本文主要是介绍华为机试 整数与IP地址间的转换 二进制字符串转数字 区别stoi(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
本题含有多组输入用例,每组用例需要你将一个ip地址转换为整数、将一个整数转换为ip地址。
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入
10.0.3.193
167969729
输出
167773121
10.3.3.193
题目链接:https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea?tpId=37&tqId=21256&rp=1&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking&tab=answerKey
其实就是把二进制的“01001001010100101“的和十进制数字的转化,我刚开始混淆了,直接用stoi,显然是错误的。stoi是对十进制的字符串进行转换的。
#include<bits/stdc++.h>
using namespace std;
int main()
{int ip[4],IP;while(scanf("%d.%d.%d.%d\n%d",&ip[0],&ip[1],&ip[2],&ip[3],&IP)!=EOF){string str="";for(int i=0;i<4;i++){int num=ip[i];string tmp="";for(int j=0;j<8;j++){if(num&1){tmp+="1";}else{tmp+="0";}num=num>>1;}reverse(tmp.begin(),tmp.end());str+=tmp;tmp="";}long long sum=0;for(int i=0;i<32;i++){if(str[i]=='1'){sum=sum*2+1;}else{sum*=2;}}cout<<sum<<endl;str="";//复用strfor(int i=0;i<32;i++){if(IP&1){str+='1';}else{str+='0';}IP=IP>>1;//总是忘记这个}reverse(str.begin(),str.end());for(int i=0;i<4;i++){sum=0;//复用sumfor(int j=i*8;j<8*(i+1);j++){if(str[j]=='1'){sum=sum*2+1;}else{sum*=2;}}cout<<sum;if(i!=3){cout<<".";}}cout<<endl;}return 0;
}
我把二进制字符串转十进制数字的包装成一个函数,以后用到可以知道摘过去。
#include<bits/stdc++.h>
using namespace std;
long long toNum(string str)
{long long sum=0;for(int i=0;i<str.size();i++){if(str[i]=='1'){sum=2*sum+1;}else{sum*=2;}}return sum;
}
int main()
{int ip[4],IP;while(scanf("%d.%d.%d.%d\n%d",&ip[0],&ip[1],&ip[2],&ip[3],&IP)!=EOF){string str="";for(int i=0;i<4;i++){int num=ip[i];string tmp="";for(int j=0;j<8;j++){if(num&1){tmp+="1";}else{tmp+="0";}num=num>>1;}reverse(tmp.begin(),tmp.end());str+=tmp;tmp="";}long long sum=0;sum=toNum(str);cout<<sum<<endl;str="";//复用strfor(int i=0;i<32;i++){if(IP&1){str+='1';}else{str+='0';}IP=IP>>1;//总是忘记这个}reverse(str.begin(),str.end());for(int i=0;i<4;i++){sum=0;//复用sumsum=toNum(str.substr(8*i,8));cout<<sum;if(i!=3){cout<<".";}}cout<<endl;}return 0;
}
这篇关于华为机试 整数与IP地址间的转换 二进制字符串转数字 区别stoi()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!