首页 > 试题广场 >

整数与IP地址间的转换

[编程题]整数与IP地址间的转换
  • 热度指数:227245 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列



输入描述:

输入 
1 输入IP地址
2 输入10进制型的IP地址



输出描述:

输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

示例1

输入

10.0.3.193
167969729

输出

167773121
10.3.3.193
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//IP地址转化为十进制数
//IPV4地址实质上是256进制,想要转化成十进制,按位乘以n个256就行
void IpToInt(int a, int b, int c, int d) {
    long num = 0;
    num = (long)a << 24 | (long)b << 16 | (long)c << 8 | (long)d;
    printf("%ld\n", num);
}
//十进制转化为IP地址
//十进制本身就是以二进制存储的,想要转化为IPV4地址,直接按位掩码再移位就行
void IntToIp(long num) {
    int a, b, c, d;
    a = (int)(num >> 24);
    b = (int)((num & 0x00ffffff) >> 16);
    c = (int)((num & 0x0000ffff) >> 8);
    d = (int)(num & 0x000000ff);
    printf("%d.%d.%d.%d\n", a, b, c, d);
}

int main() {
    int a, b, c, d;
    long num;
    scanf("%d.%d.%d.%d", &a, &b, &c, &d);   //可以直接按分割符%c分割%d输入,不用%s
    scanf("%ld", &num);
    IpToInt(a, b, c, d);
    IntToIp(num);
    return 0;
}

发表于 2024-06-23 12:20:32 回复(0)
//注意:本题需要用到long int,否则溢出。
#include "stdio.h"
#include "string.h"
int main()
{
    long a,b,c,d;
    long int str_IP;
    scanf("%ld.%ld.%ld.%ld",&a,&b,&c,&d);
    scanf("%ld",&str_IP);
    //第一部分:IP地址转化为十进制数
    //注意:IPV4地址实质上是256进制(各部分最高为255),想要转化成十进制,按位乘以n个256就行了.
    printf("%ld\n", (d*1)+(c*256)+(b*256*256)+(a*256*256*256));
    //第二部分:十进制转化为IP地址
    //与第一部分相反,十进制转化为IPV4地址,末尾为十进制数取余(毕竟不管除以多少个256,余数就是末尾*1嘛,末尾的权重是1);往上三段分别先去掉余数,然后去掉较大部分占用的256,在除以自己代表的256个数(权重)
    long int add_a,add_b,add_c,add_d;//千位,百位,十位,个位
    add_d = str_IP%256;
    add_a = (str_IP - add_d*1)/256/256/256;
    add_b = (str_IP - add_d*1-add_a*256*256*256)/256/256;
    add_c = (str_IP - add_d*1-add_a*256*256*256-add_b*256*256)/256;
    printf("%ld.%ld.%ld.%ld",add_a,add_b,add_c,add_d);
}

发表于 2024-03-28 00:19:35 回复(1)
#include <stdio.h>
#include <string.h>
 
int main() {
    int a, b, c, d;
    char ch;
    scanf("%d %c %d %c %d %c %d", &a, &ch, &b, &ch, &c, &ch, &d);
    unsigned int res1 = (a << 24) | (b << 16) | (c << 8) | (d );
    printf("%u\n", res1);

    unsigned int x ;
    scanf("%u", &x);
    a = (x & 0xFF000000) >> 24;
    b = (x & 0x00FF0000) >> 16;
    c = (x & 0x0000FF00) >> 8;
    d = (x & 0x000000FF) ;
    printf("%u.%u.%u.%u",a,b,c,d);

   
    return 0;
}
发表于 2024-01-24 16:04:28 回复(0)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void IpToInt(int a, int b, int c, int d)
{
    long num = 0;
    num = (long)a << 24 | (long)b << 16 | (long)c << 8 | (long)d;
    printf("%ld\n", num);
}

void IntToIp(long num)
{
    int a, b, c, d;
    a = (int)(num >> 24);
    b = (int)((num & 0x00ffffff) >> 16);
    c = (int)((num & 0x0000ffff) >> 8);
    d = (int)(num & 0x000000ff);
    printf("%d.%d.%d.%d\n", a, b, c, d);
}

int main()
{
    int a, b, c, d;
    long num;
    scanf("%d.%d.%d.%d", &a, &b, &c, &d);
    scanf("%ld", &num);
    IpToInt(a, b, c, d);
    IntToIp(num);
    return 0;
}

发表于 2023-12-07 21:59:02 回复(0)
#include <stdio.h>
#include <string.h>
#include <math.h>

//字符串变成整数
long ctoint(char* str)
{
    int len = strlen(str);
    long ret = 0;
    for(int i = 0;i<len;i++)
    {
        ret = ret*10 + (str[i]-'0');
    }
    return ret;
}

int main() {
    char str[16] = { '\0' };
    long addr = 0;
    while (scanf("%s", str) != EOF) {
        scanf("%ld", &addr);
        //把ip地址转换成长整型
        int len = strlen(str);
        long ret = 0;
        int j = 0;
        int i = 0;
        for (i = len - 1; i >= 0; i--)
        {
            if (str[i] == '.')
            {
                ret += ctoint(&str[i + 1]) *(long) pow((int)2, (int)(8 * j));
                j++;
                str[i] = '\0';
            }
        }
        ret += ctoint(&str[i + 1]) * (long)pow((int)2, (int)(8 * j));
        printf("%ld\n", ret);
        //对一个长整型转换成ip
        for (int i = 0; i < 4; i++)
        {
            long m = addr / (long)pow((int)2, (int)(8 * (3 - i)));
            printf("%ld", m);
            if (i < 3)
            {
                printf( ".");
            }
            addr %= (long)pow((int)2, (int)(8 * (3 - i)));
        }
        printf("\n");
    }
    return 0;
}
发表于 2023-10-10 18:53:09 回复(0)
小白全网最笨方法,运行超时提交不了,但是写了2个小时了,太笨了,不发出来全浪费了
#include
<math.h>
#include <stdio.h>
#include<string.h>
int zhuanhuan(int *tens,int l)
{
    int sum = 0;
    int temp = 0;
    int cnt = 0;
    int res[32] = {0};
    int els;
    for (int i = 0; i<=3; i++) {
        temp = tens[i];
    while (temp!=0) {
        int temp2 = temp;
        while (temp>0) {
            temp/=2;
            cnt++;
        }
        res[(3-i)*8+cnt-1] = 1;
        temp = temp2-pow(2, cnt-1);
        cnt = 0;
    }
    }
    for (int i=0; i<32; i++) {
        sum += (pow(2, i)*res[i]);
    }
    return sum;
}
void zhuanhuan2(int n)
{
    int ye[32] = {0};
    int res[4] = {0};
    int temp = n;
    int cnt = 0,l=0,cifang = 0;
    while (temp!=0)
    {
        int temp2 = temp;
    while (temp>0)
    {
        temp/=2;
        cnt++;
    }
    ye[cnt-1] = 1;
    temp = temp2 - pow(2,cnt-1);
    cnt = 0;
    }
    for (int i = 0; i < 32; i++)
    {
        if (cifang==8||i==31)
        {
            cifang=0;
            l++;
        }
        res[l] += pow(2,cifang++)*ye[i];
    }
    for (int i = l-1; i >=0; i--)
    {
        printf("%d",res[i]);
        if (i!=0)
        {
            printf(".");
        }
    }
}
int main() {
    int tens[4]={0};
    char ip[15]={0};
    scanf("%s",ip);
    int num;
    scanf("%d",&num);
    int len = strlen(ip);
    int temp = 0;
    int l = 0,hunds=0,p=0;
    for (int i=0; i<len; i++) {
        if (ip[i]=='.'||i==len-1) {
            if (i==len-1)
            {
                i++;
            }          
            for (int j = i-1; j>=temp; j--) {
                tens[p]+= (ip[j]-'0')*pow(10,hunds++);
            }
            p++;
            hunds = 0;
            temp = i+1;
        }
    }
    printf("%d\n",zhuanhuan(tens,l));
    zhuanhuan2(num);
    return 0;
}

发表于 2023-09-08 17:03:19 回复(0)
/*
根据题目输入格式投机取巧了
*/
#include <stdio.h>
#include <math.h>
int main() {
    unsigned long int ip = 0;
    unsigned long int num[4] = {0};
    unsigned long int outip = 0;
    unsigned long int outnum[4] = {0};
    char c;

    scanf("%ld%c%ld%c%ld%c%ld%c%ld", &num[3], &c, &num[2], &c, &num[1], &c, &num[0], &c,
          &ip);
    // printf("%d %d %d %d\n", num[3], num[2], num[1], num[0]);
    // scanf("%d", &ip);
    //printf("%d\n",ip);
    for (int i = 0; i < 4; i++) {
        outip += num[i] * pow(2, 8 * i);
    }
    for (int i = 3; i >= 0; i--) {
        outnum[i] = ip / ((int)pow(2, 8 * i));
        //printf("%d ",outnum[i]);
        ip %= (int)pow(2, 8 * i);
    }
    printf("%ld\n", outip);
    printf("%ld.%ld.%ld.%ld\n", outnum[3], outnum[2], outnum[1], outnum[0]);
    return 0;
}
发表于 2023-03-17 22:36:02 回复(0)
#include <stdio.h>

//本质是256进制和10进制相互转换的问题,注意长整数不能用int
int main() {
    long ip[4] = {0};
    long out_ip[4] = {0};
    long ip_num = 0;
    long out_ip_num = 0;

    scanf("%ld.%ld.%ld.%ld", &ip[0], &ip[1], &ip[2], &ip[3]);
    scanf("%ld", &ip_num);

    out_ip_num = ip[3] + ip[2] * 256 + ip[1] * 256 * 256 + ip[0] * 256 * 256 * 256;
    for (int i = 0; i < 4; i++) {
        out_ip[3 - i] = ip_num % 256;
        ip_num /= 256;
    }

    printf("%ld\n", out_ip_num);
    printf("%ld.%ld.%ld.%ld", out_ip[0], out_ip[1], out_ip[2], out_ip[3]);
    return 0;
}

发表于 2023-02-26 13:49:45 回复(0)
佩服我之前的奇思妙想,现在根本就想不到。
#include <stdio.h>

int strToint(unsigned int a, unsigned int b, unsigned int c, unsigned int d)
{
    unsigned int ip;
    char hexIp[9] = {0};
    sprintf(hexIp, "%02x%02x%02x%02x", a, b, c, d);
    sscanf(hexIp, "%x", &ip);
    printf("%u\n", ip);
    return 0;
}

int intTostr(unsigned int ip)
{
    unsigned int a, b, c, d;
    char hexIp[9] = {0};
    sprintf(hexIp, "%08x", ip);
    sscanf(hexIp, "%02x%02x%02x%02x", &a, &b, &c, &d);
    printf("%d.%d.%d.%d", a, b, c ,d);
    return 0;
}

int main()
{
    unsigned int a, b, c, d, intIp;
    scanf("%u.%u.%u.%u %u", &a, &b, &c, &d, &intIp);
    strToint(a, b, c, d);
    intTostr(intIp);
    return 0;
}


发表于 2022-11-22 11:35:30 回复(0)
#include <stdio.h>
int main(void) {
    unsigned ip[4];
    scanf("%u.%u.%u.%u", &ip[0], &ip[1], &ip[2], &ip[3]);
    printf("%u\n", ip[0]<<24|ip[1]<<16|ip[2]<<8|ip[3]);
    scanf("%u", &ip[0]);
    printf("%u.%u.%u.%u\n", ip[0]>>24, ip[0]>>16&0xff, ip[0]>>8&0xff, ip[0]&0xff);
    return 0;
}

发表于 2022-08-18 23:29:08 回复(0)
放松题。。。感觉只是想考一下位运算
#include <stdio.h>
int main()
{
    int a1,a2,a3,a4;
    unsigned int b;
    scanf("%d.%d.%d.%d %u", &a1,&a2,&a3,&a4,&b);
    printf("%u\n%d.%d.%d.%d", 
           (a1<<24)|(a2<<16)|(a3<<8)|a4,
           b>>24,(b>>16)&255,(b>>8)&255,b&255);
    return 0;
}


发表于 2022-06-13 23:42:52 回复(1)
#include <stdio.h>

int main()
{
    unsigned long int ipaddr = 0;
    unsigned char *c = (unsigned char *) &ipaddr;
    
    scanf("%hhu.%hhu.%hhu.%hhu", &c[3], &c[2], &c[1], &c[0]);
    printf("%lu\n", ipaddr);
    
    scanf("%lu", &ipaddr);
    printf("%hhu.%hhu.%hhu.%hhu", c[3], c[2], c[1], c[0]); 
    return 0;
}

发表于 2022-04-28 14:25:42 回复(0)
#include <stdio.h>
#include <math.h>
int main()
{
    int arr[4],i,j,p[32]={0};
    long long ip1,ip2=0;        //刚开始用的int类型,发现不够用,会出错
    scanf("%d.%d.%d.%d",&arr[3],&arr[2],&arr[1],&arr[0]);
    scanf("%ld",&ip1);
    for(i=0;i<4;i++)
    {
        ip2+=arr[i]*pow(16,2*i);
    }
    i=31;
    while(ip1>0)
    {
        p[i--]=ip1%2;
        ip1/=2;
    }
    for(i=0;i<4;i++)
    {
        arr[i]=0;
        for(j=8*i;j<8*i+8;j++)
        {
            arr[i]*=2;
            arr[i]+=p[j];
        }
    }
    printf("%ld\n%d.%d.%d.%d\n",ip2,arr[0],arr[1],arr[2],arr[3]);
    return 0;
}

发表于 2022-04-21 10:06:25 回复(0)
不懂为啥这道题难度也算中等?这不是入门题目吗?

int main()
{
    unsigned int a, data[4];
       
    scanf("%d.%d.%d.%d", &data[0], &data[1], &data[2], &data[3]);
    scanf("%d", &a);
      
    printf("%u\n", (data[0]<<24)+(data[1]<<16)+(data[2]<<8)+data[3]);
    printf("%d.%d.%d.%d", a>>24, (a>>16)&0xff, (a>>8)&0xff, a&0xff);
}





发表于 2022-04-17 21:18:57 回复(0)
感觉自己的解题思路比前几名简单,但是耗时较久(6ms)
#include <stdio.h>
int main()
{
    char szBuf[50] = {0};
    long ip = 0;
    int a,b,c,d;
    unsigned int Ret = 0;
    
    while(scanf("%s", szBuf) != EOF)
    {
        scanf("%ld", &ip);
        sscanf(szBuf, "%d.%d.%d.%d", &a, &b, &c, &d);
        
        Ret = 0;
        Ret = (a << 24) + (b << 16) + (c << 8) + d;
        printf("%ld\n", Ret);
        
        printf("%d.%d.%d.%d\n", (ip & 0xFF000000) >> 24, (ip & 0x00FF0000) >> 16, 
               (ip & 0x0000FF00) >> 8, (ip & 0x000000FF));
    }
    
    return 0;
}


发表于 2022-02-28 10:20:40 回复(0)
#include <stdio.h>
int main()
{
    unsigned int ip1,ip2,ip3,ip4,ip;
    while(scanf("%d.%d.%d.%d\n%d",&ip1,&ip2,&ip3,&ip4,&ip) != EOF)
    {
        printf("%u\n",(ip1 << 24)+(ip2 << 16)+(ip3 << 8)+ip4);
        printf("%d.%d.%d.%d\n",(ip & 0xFF000000)>>24,(ip & 0x00FF0000)>>16,(ip & 0x0000FF00)>>8,ip & 0x000000FF);
    }
    return 0;
}
发表于 2021-12-17 14:37:53 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned int uint32_t;

uint32_t IP_2_int(char *str)
{
    int digit[10] = {0};
    int k = 0;
    uint32_t sum = 0;
    for(int i=0; str[i] != '\0'; i++)
    {
        if(str[i] == '.')
            k++;
        else
        {
            digit[k] = digit[k] * 10 + (str[i]-'0');
        }
    }
    //printf("%d\n", digit[0]);
    //printf("%d\n", digit[1]);
    //printf("%d\n", digit[2]);
    //printf("%d\n", digit[3]);
    return sum = (digit[0] << (3*8)) + (digit[1] << (2*8)) + (digit[2] << (1*8)) + (digit[3]);
}

void int_2_IP(uint32_t digit)
{
    int a[4];
    for(int i=3; i>=0; i--)
    {
        a[i] = digit % 256;
        digit >>= 8;
    }
    for(int i=0; i<4; i++)
    {
        printf("%d", a[i]);
        if(i<3)
        printf(".");
    }
}

int main()
{
    //char str1[20] = "10.3.3.193";
    char str1[20] = {0};
    char str2[20] = {0};
    uint32_t sum = 0;
    
    while(scanf("%s", str1) != EOF)
    {
        uint32_t digit = 0;
        scanf("%s", str2);
        /*ip转无符号整型*/
        sum = IP_2_int(str1);
        printf("%u\n", sum);
        
        for(int i=0; str2[i] != '\0'; i++)
        {
            digit = digit*10 + (str2[i]-'0');
        }
        int_2_IP(digit);
        printf("\n");
        
     //   memset(str1, 0, sizeof(char));
     //   memset(str2, 0, sizeof(char));
     //   printf("%s", str2);
    }

}


编辑于 2021-07-28 01:00:47 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char input[1000];
    int i,j;
    while(scanf("%s",input)!=EOF)
    {
        int a[100]={0};
        int temp=0;
        int len=strlen(input);
        int count=0;
        for(i=0;i<len;i++)
        {
            if(input[i]!='.')
            {
                temp=temp*10+input[i]-'0';
            }
            else
            {
                a[count++]=temp;
                temp=0;
            }
        }
        a[count]=temp;
        count++;
        int int_result=0;
        for(i=0;i<count;i++)
        {
            int_result=int_result*256+a[i];
        }
        printf("%ld\n",int_result);
        long int_input;
        scanf("%ld",&int_input);
        count=0;
        while(int_input!=0)
        {
            a[count++]=int_input%256;
            int_input=int_input/256;
        }
        for(i=count-1;i>=1;i--)
        {
            printf("%d.",a[i]);
        }
        printf("%d\n",a[0]);
    }
    return 0;
}

发表于 2021-07-15 19:13:42 回复(0)