### 前準備
コンソールからの入力の受け取り
fn main() { println!("文字を入力してください:"); let mut word = String::new(); std::io::stdin().read_line(&mut word).ok(); let answer = word.trim().to_string(); println!("{}", answer); }
文字を入力してください:
aaa
aaa
### お札、硬貨の枚数も合わせて返却する。
Hashmapにinsertするところは関数化したい
use std::collections::HashMap; use itertools::Itertools; fn cash_change(mut change: u32) -> HashMap<u32, u32> { let mut change_map: HashMap<u32, u32> = HashMap::new(); if change / 5000 > 0 { change_map.insert(5000, change/5000); change = change % 5000; } if change / 1000 > 0 { change_map.insert(1000, change/1000); change = change % 1000; } if change / 500 > 0 { change_map.insert(500, change/500); change = change % 500; } if change / 100 > 0 { change_map.insert(100, change/100); change = change % 100; } if change / 50 > 0 { change_map.insert(50, change/50); change = change % 50; } if change / 10 > 0 { change_map.insert(10, change/10); change = change % 10; } if change > 0 { change_map.insert(1, change); } change_map } fn main() { println!("投入する金額を入力してください:"); let mut word = String::new(); std::io::stdin().read_line(&mut word).ok(); let cash: u32 = word.trim().parse().expect("entered string was not a number"); println!("商品の金額を入力してください:"); let mut word = String::new(); std::io::stdin().read_line(&mut word).ok(); let price: u32 = word.trim().parse().expect("entered string was not a number"); println!("お釣りは[{}]です。", cash - price); let mut change_map = cash_change(cash - price); let mut v: Vec<_> = change_map.into_iter().collect(); v.sort_by(|x,y| y.0.cmp(&x.0)); println!("{:?}", v); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
Running `target/debug/rust`
投入する金額を入力してください:
1000
商品の金額を入力してください:
333
お釣りは[667]です。
[(500, 1), (100, 1), (50, 1), (10, 1), (1, 7)]
### もっと簡潔に
use std::collections::HashMap; use itertools::Itertools; fn cash_change(mut change: u32) -> HashMap<u32, u32> { let mut change_map: HashMap<u32, u32> = HashMap::new(); let coin = vec![5000, 1000, 500, 100, 50, 10, 1]; for i in coin { if change / i > 0 { change_map.insert(i, change/i); change = change % i; } } change_map } fn main() { println!("投入する金額を入力してください:"); let mut word = String::new(); std::io::stdin().read_line(&mut word).ok(); let cash: u32 = word.trim().parse().expect("entered string was not a number"); println!("商品の金額を入力してください:"); let mut word = String::new(); std::io::stdin().read_line(&mut word).ok(); let price: u32 = word.trim().parse().expect("entered string was not a number"); println!("お釣りは[{}]です。", cash - price); let mut change_map = cash_change(cash - price); let mut v: Vec<_> = change_map.into_iter().collect(); v.sort_by(|x,y| y.0.cmp(&x.0)); println!("{:?}", v); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/rust`
投入する金額を入力してください:
3000
商品の金額を入力してください:
200
お釣りは[2800]です。
[(1000, 2), (500, 1), (100, 3)]
おおおおおおお、なるほど〜。同じ処理のところはイテレータにしてforループで回せば、より簡潔に書けますね。