首页 > 试题广场 >

整数与IP地址间的转换

[编程题]整数与IP地址间的转换
  • 热度指数:234959 时间限制: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 <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned int ipStrtoInt(char *ip)
{
    char *p=ip;
    unsigned int ans=0,seg=0;
    while(*p)
    {
        if(*p!='.')
            seg=seg*10+*p-'0';
        else if(*p=='.')
        {
            ans=(ans<<8)+seg;
            seg=0;
        }
        p++;
    }
    ans=(ans<<8)+seg;

    return ans;
}

char *ipInttoipStr(unsigned int intip)
{
    char *ans=malloc(sizeof(char)*16);
    char *p=ans;
    int i;
    unsigned int seg;
    char stack[3];
    int top=0;

    for(i=0;i<4;i++)
    {
        seg=(intip & 0xFF000000)>>24;
        intip=intip<<8;
        if(seg==0 && i<=2)
        {
            *p++='0';
            *p++='.';
            continue;
        }
        else if(seg==0 && i==3)
        {
            *p++='0';
            break;          
        }
        while(seg)
        {
            stack[top++]=seg%10+'0';
            seg=seg/10;
        }
        while(top)
        {
            *p=stack[--top];
            p++;
        }
        if(i<=2)
            *p++='.';
    }
    *p='\0';

    return ans;
}

int main() {
    char ip[16];
    unsigned int intip,intip1;
    char *ipstr;

    memset(ip,0,sizeof(char)*16);
    scanf("%s",ip);
    scanf("%d",&intip1);

    intip=ipStrtoInt(ip);
    ipstr=ipInttoipStr(intip1);

    printf("%u\r\n",intip);
    printf("%s",ipstr);

    return 0;
}
发表于 2025-02-16 23:46:05 回复(0)
#include <stdio.h>

//用位思想解决,也就是直接按题目说的处理,注意确保是无符号整型,否则会变成负数

int main() {
    unsigned int d1,d2,d3,d4;
    scanf("%u.%u.%u.%u",&d1,&d2,&d3,&d4);
    d1 = d1<<24;
    d2 = d2<<16;
    d3 = d3<<8;
    unsigned int d = d1+d2+d3+d4;
    printf("%u\n",d);
    scanf("%u",&d);
    d1 = (d&0xFF000000)>>24;
    d2 = (d&0x00FF0000)>>16;
    d3 = (d&0x0000FF00)>>8;
    d4 = d&0x000000FF;
    printf("%u.%u.%u.%u",d1,d2,d3,d4);
    return 0;
}

发表于 2025-02-12 10:30:11 回复(0)
#include <stdio.h>

unsigned int toNum(char * str){
    unsigned int ip = 0;

    int count = 3;
    for (char * t = strtok(str, "."); t != NULL; t = strtok(NULL, ".")){
        int number = 0;
        for (int i = 0; i < strlen(t); i ++){
            number = number * 10 + t[i] - '0';
        }
        ip += number * pow(256, count);
        count--;
    }

    return ip;
}

void toStr(unsigned int ip, char * str){
    for (int i = 3; i >= 0; i --){
        if (i != 0){
            int num = ip / pow(256, i);
            sprintf(str, "%s%d.", str, num);
            ip -= num * pow(256, i);
        } else{
            sprintf(str, "%s%d", str, ip);
        }
    }
}

int main() {
    char ip1[16];
    unsigned int ip2;
    scanf("%s %d", ip1, &ip2);

    char str[16] = {0};

    toStr(ip2, str);
    printf("%u\n%s\n", toNum(ip1), str);
    
    return 0;
}

发表于 2025-02-07 17:33:39 回复(0)
#include <stdio.h>
#include <math.h>
/*
ip转十进制:把ip的四个数字乘256加一块输出
十进制转ip:同理,对其除256取余4次
数挺大的,输入输出都得用长整型
*/

int main() {
    int a,b,c,d;        //ip的四个数字
    long dec;            //十进制的ip
    long dec_o;          //输出的十进制
    int oa,ob,oc,od;    //输出的ip
    scanf("%d.%d.%d.%d",&a,&b,&c,&d);
    scanf("%ld",&dec);

    //ip转十进制
    dec_o=a*pow(256,3)+b*pow(256,2)+c*256+d;

    //十进制转ip
    od=dec%256;
    dec/=256;
    oc=dec%256;
    dec/=256;
    ob=dec%256;
    dec/=256;
    oa=dec%256;

    printf("%ld\n",dec_o);
    printf("%d.%d.%d.%d",oa,ob,oc,od);
    return 0;
}

发表于 2025-01-04 13:24:01 回复(0)
#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)