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には基数変換のライブラリが多数ある模様