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

整数与IP地址间的转换

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

use std::io::{self, *};

fn main() {
    let mut buf=String::new();
    io::stdin().read_line(&mut buf).unwrap();
    //输入的ip地址
    let ip=buf.trim().to_string();
    buf.clear();
    io::stdin().read_line(&mut buf).unwrap();
    //输入的整数
    let num=buf.trim().parse::<u32>().unwrap();
    let ip2num=ip2num(ip);
    let num2ip=num2ip(num);
    print!("{}\n{}",ip2num,num2ip);
}
fn ip2num(ip:String)->u32{
    let ip:Vec<&str>=ip.split(".").collect();
    let mut binary_str=String::new();
    for val in &ip{
        let num=val.parse::<u8>().unwrap();
        let binary=format!("{:#010b}",num);
        binary_str.push_str(&binary[2..])
    }
    let mut result1=0;
    for (idx,val) in binary_str.chars().rev().enumerate(){
        let base=val.to_digit(10).unwrap();
        result1+=base*2_u32.pow(idx as u32);
    }
    result1
}
fn num2ip(num:u32)->String{
    let t=format!("{:#034b}",num);
    let binary_num=&t[2..];
    let mut vec:Vec<&str>=vec![];
    let mut i=0;
    while i<32{
        vec.push(&binary_num[i..i+8]);
        i+=8;
    }
    let mut result2=String::new();
    for val in vec{
        let mut digit=0;
        for (idx,c) in val.chars().rev().enumerate(){
            let base=c.to_digit(10).unwrap();
            digit+=base*2_u32.pow(idx as u32);
        }
        result2.push_str(&digit.to_string());
        result2.push_str(".");
    }
    result2.pop();
    result2
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务