HJ33. 整数与IP地址间的转换
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
输入描述
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例1
输入:
10.0.3.193 167969729
输出:
167773121 10.3.3.193
C 解法, 执行用时: 1ms, 内存消耗: 356KB, 提交时间: 2021-03-04
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> int main(){ char str_ip[50]; uint8_t arr_ip[4]; uint32_t int_ip; while(scanf("%s %d", str_ip, &int_ip) == 2){ for(int i = 0, j = 0; i < strlen(str_ip); i++){ if(i == 0){ arr_ip[j] = (uint8_t)atoi(str_ip); j++; }else{ if(str_ip[i] == '.'){ arr_ip[j] = (uint8_t)atoi(str_ip + i + 1); j++; } } } printf("%u\n", (int)(arr_ip[0] << 24) + (int)(arr_ip[1] << 16) + (int)(arr_ip[2] << 8) + (int)arr_ip[3]); for(int i = 0; i < 4; i++){ arr_ip[i] = (uint8_t)(int_ip >> ((3 - i) * 8)); } printf("%d.%d.%d.%d\n", arr_ip[0], arr_ip[1], arr_ip[2], arr_ip[3]); } }
C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2021-06-05
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int ip_to_num(int ip_addr, int ip_cnt) { int i = 0; int cout = 0; int bin[8] = {0}; while (ip_addr) { bin[i++] = ip_addr % 2; ip_addr /= 2; } for (int j = 7; j >= 0; j--) { ip_cnt--; cout += bin[j] * pow(2, ip_cnt); } return cout; } void num_to_ip(int ip_num) { int tmp = 0; int ip_cnt = 3; for (int i = 0; i < 3; i++) { tmp = (ip_num >> ip_cnt * 8) & 0xff; printf("%d.", tmp); ip_cnt--; } tmp = (ip_num >> ip_cnt * 8) & 0xff; printf("%d\n", tmp); } int main() { char str[20] = {"\0"}; while (fgets(str, sizeof(str), stdin)) { char tmp_str[5] = {"\0"}; //临时存放每节ip地址 int len = strlen(str); int ip_num = 0; int tmp_len = 0; int ip_cnt = 4; if ((str[1] == '.') || (str[2] == '.') || (str[3] == '.')) //判断是ip地址还是整数 { //IP地址 for (int i = 0; i <len; i++) { if (str[i] != '.') { tmp_str[tmp_len++] = str[i]; } else { ip_num += ip_to_num(atoi(tmp_str), ip_cnt * 8); memset(tmp_str, 0, tmp_len); tmp_len = 0; ip_cnt--; } } if (tmp_str != '\0') { ip_num += ip_to_num(atoi(tmp_str), ip_cnt * 8); } printf("%u\n", ip_num); } else { //整数 num_to_ip(atoi(str)); } } return 0; }