题解 | #整数与IP地址间的转换#

整数与IP地址间的转换

https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea

package main

import (
    "fmt"
    "strings"
    "strconv"
    "math"
)

func ip2number(s string) int {
    var bits [32]int
    var idx int

    ipSegment := strings.Split(s, ".")
    for _, segment := range ipSegment {
        var bit [8]int
        segmentIdx := 7
        number, _ := strconv.Atoi(segment)
        for number > 0 {
            bit[segmentIdx] = number % 2
            number /= 2
            segmentIdx--
        }

        for i:=0; i<8; i++ {
            bits[idx] = bit[i]
            idx++
        }
    }

    var sum int
    var powIdx int
    for i:=31; i>=0; i-- {
        sum += bits[i] * int(math.Pow(float64(2.0), float64(powIdx)))
        powIdx++
    }

    return sum
}

func number2ip(n int) string {
    var bits [32]int
    idx := 31

    for n > 0 {
        bits[idx] = n % 2
        n /= 2
        idx--
    }

    var ipSegment []int
    for i:=0; i<32; i=i+8 {
        segment := bits[i:i+8]
        var sum int
        var powIdx int
        for j:=7; j>=0; j-- {
            sum += segment[j] * int(math.Pow(float64(2.0), float64(powIdx)))
            powIdx++
        }
        ipSegment = append(ipSegment, sum)
    }

    return fmt.Sprintf("%d.%d.%d.%d", ipSegment[0], ipSegment[1], ipSegment[2], ipSegment[3])
}

func main() {
    var ip string
    var n int

    fmt.Scan(&ip, &n)

    fmt.Println(ip2number(ip))
    fmt.Println(number2ip(n))
}
// 本题输入为两行,所以采用:fmt.Scan(&ip, &n)

全部评论

相关推荐

码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
_mos_:忍耐王
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务