11を2進数にすると、
11/2 = 5 余り1
5/2 = 2 余り1
2/2 = 1 余り0
1/2 = 0 余り1
余りを先頭に足していく[1101]が答えになる。
それをそのままコードに落とし込む。こういう処理はfor文よりもwhileの方が向いている。なお、基数の値は、2進数から3、4と変えてもきちんと計算できる。
fn main() { let mut result = String::new(); let mut target = 11; static cardinal: u32 = 2; while target >= cardinal { let rest = target % cardinal; result = format!("{}{}", rest.to_string(), result); target = target / cardinal; } result = format!("{}{}", target.to_string(), result); println!("{}", result); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.23s
Running `target/debug/rust`
1011
2進数から10進数への変換
fn main() { to_cardinal(2, 55); } fn from_cardinal(cardinal: u32, t: u32){ let target:String = t.to_string(); let digit = target.chars().count(); let mut result = 0; for i in 0..digit { let base = cardinal.pow((digit - i - 1).try_into().unwrap()); let s = target.chars().nth(i).unwrap(); let num = s.to_digit(10).unwrap() * base; result = result + num; } println!("{}", result); }
うーん、to_cardinalがなんか違うような気がする
なお、rustには基数変換のライブラリが多数ある模様