Rust 练习(二)

  1. 从键盘输入一个n,代表一维数组包含的元素数,从键盘读入一个由数字字符和空格组成的字符串,并将它们转换成int型存入到一维数组中。如果得到的数字不足n位,剩余的几个数组元素由0补足,如果超过n位截取前n位组成的数组,并输出该数组。

example:

input:

5

2 3 1 7 10 15

output:

[2, 3, 1, 7, 10]

input:

4

10 2

output:

[10, 2, 0, 0]

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let n: i32 = input.trim().parse().expect("Failed to parse input");
 7
 8    input.clear();
 9    stdin().read_line(&mut input).expect("Failed to read line");
10    let mut nums: Vec<i32> = input
11        .split_whitespace()
12        .map(|s| s.parse().expect("Failed to parse input"))
13        .collect();
14
15    if nums.len() >= n as usize {
16        println!("{:?}", &nums[..n as usize]);
17    } else {
18        nums.extend(vec![0; n as usize - nums.len()]);
19        println!("{:?}", nums);
20    }
21}
  1. 从键盘接收一个由数字字符和空格组成的字符串,将其转换为整型数据存储在一维数组中。判断该一维数组中是否存在重复元素,如果有重复元素,输出False,否则输出True。

example:

input:

3 2 1 7 5 6 8 0

output:

True

input:

2 2 1 3 4 3 8 6

output:

False

 1use std::collections::HashSet;
 2use std::io::stdin;
 3
 4fn main() {
 5    let mut input = String::new();
 6    stdin().read_line(&mut input).expect("Failed to read line");
 7    let nums: Vec<i32> = input
 8        .split_whitespace()
 9        .map(|s| s.parse().expect("Failed to parse input"))
10        .collect();
11
12    let nums_set: HashSet<i32> = nums.iter().cloned().collect();
13    if nums_set.len() == nums.len() {
14        println!("True");
15    } else {
16        println!("False");
17    }
18}
  1. 从键盘输入一个n,创建一个n * n的二维数组,在二维数组中,第0行的值为1,第1行的值为2,以此类推,第n-1的值为n。输出此二维数组。

example:

input:

5

output:

[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]]

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).unwrap();
 6    let num: i32 = input.trim().parse().unwrap();
 7
 8    let mut mat: Vec<Vec<i32>> = Vec::new();
 9
10    for i in 0..num {
11        mat.push(vec![i + 1; num as usize]);
12    }
13    println!("{:?}", mat);
14}
  1. 输出第三题得到的二维数组的转置数组。

example:

input:

5

output:

[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

input:

4

output:

[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

 1use std::io::stdin;
 2
 3fn get_mat(n: i32) -> Vec<Vec<i32>> {
 4
 5    let mut mat: Vec<Vec<i32>> = Vec::new();
 6
 7    for i in 0..n {
 8        mat.push(vec![i + 1; n as usize]);
 9    }
10    mat
11}
12
13fn main() {
14    let mut input = String::new();
15    stdin().read_line(&mut input).unwrap();
16    let num: i32 = input.trim().parse().unwrap();
17
18    let mat = get_mat(num);
19    let mut result: Vec<Vec<i32>> = vec![vec![0; num as usize]; num as usize];
20    for i in 0..num as usize {
21        for j in 0..num as usize {
22            result[j][i] = mat[i][j];
23        }
24    }
25
26    println!("{:?}", result);
27
28}
  1. 从键盘输入一个n,代表二维数组的行和列,依次读入n行由空格和数字字符组成的字符串,将字符串中的每个数字字符转换成整形数据,存成二维数组的一行,如果输入的数字字符数目少于n个,以0补足,如果超过n个,截取前n位。

example:

input:

5

3 2 1 7 6 8

11 2 4 12 5

4 3 1

7 6 5

1

output:

[[3, 2, 1, 7, 6], [11, 2, 4, 12, 5], [4, 3, 1, 0, 0], [7, 6, 5, 0, 0], [1, 0, 0, 0, 0]]

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let n: i32 = input.trim().parse().expect("Failed to parse input");
 7    input.clear();
 8
 9    let mut mat: Vec<Vec<i32>> = Vec::new();
10    for _ in 0..n {
11        input.clear();
12        stdin().read_line(&mut input).expect("Failed to read line");
13        let mut row: Vec<i32> = input
14            .trim()
15            .split_whitespace()
16            .map(|x| x.parse().expect("Failed to parse input"))
17            .collect();
18        if row.len() >= n as usize {
19            mat.push(row[..n as usize].to_vec());
20        } else {
21            row.extend(vec![0; n as usize - row.len()]);
22            mat.push(row);
23        }
24    }
25    println!("{:?}", mat);
26}
  1. 以第五题方法读入一个n * n的二维数组,输出该二维数组与其转置数组乘积后得到的新数组。

example:

input:

5

3 2 1 7 6 8

11 2 4 12 5

4 3 1

7 6 5

1

output:

[[99, 155, 19, 38, 3], [155, 310, 54, 109, 11], [19, 54, 26, 51, 4], [38, 109, 51, 110, 7], [3, 11, 4, 7, 1]]

 1use std::io::stdin;
 2
 3fn get_mat(n: i32) -> Vec<Vec<i32>> {
 4    let mut input = String::new();
 5    let mut mat: Vec<Vec<i32>> = Vec::new();
 6    for _ in 0..n {
 7        input.clear();
 8        stdin().read_line(&mut input).expect("Failed to read line");
 9        let mut row: Vec<i32> = input
10            .trim()
11            .split_whitespace()
12            .map(|x| x.parse().expect("Failed to parse input"))
13            .collect();
14        if row.len() >= n as usize {
15            mat.push(row[..n as usize].to_vec());
16        } else {
17            row.extend(vec![0; n as usize - row.len()]);
18            mat.push(row);
19        }
20    }
21    return mat;
22}
23
24fn get_transpose(mat: &Vec<Vec<i32>>, n: i32) -> Vec<Vec<i32>> {
25    let mut result: Vec<Vec<i32>> = vec![vec![0; n as usize]; n as usize];
26    for i in 0..n as usize {
27        for j in 0..n as usize {
28            result[j][i] = mat[i][j];
29        }
30    }
31    return result;
32}
33
34fn mat_multiply(mat_a: &Vec<Vec<i32>>, mat_b: &Vec<Vec<i32>>, n: i32) -> Vec<Vec<i32>> {
35    let mut result: Vec<Vec<i32>> = vec![vec![0; n as usize]; n as usize];
36    for i in 0..n as usize {
37        for j in 0..n as usize {
38            for k in 0..n as usize {
39                result[i][j] += mat_a[i][k] * mat_b[k][j];
40            }
41        }
42    }
43    return result;
44}
45
46fn main() {
47    let mut input = String::new();
48    stdin().read_line(&mut input).expect("Failed to read line");
49    let n: i32 = input.trim().parse().expect("Failed to parse input");
50
51    let original = get_mat(n);
52    let transposed = get_transpose(&original, n);
53
54    let result: Vec<Vec<i32>> = mat_multiply(&original, &transposed, n);
55
56    println!("{:?}", result);
57}
  1. 从键盘读入一个n,代表n位同学,依次读入n组由数字字符和空格组成的字符串,将其存储为一个 3 * n的二维数组。二维数组中每一项为一个浮点型数据,代表一位同学同一门课的三次考试的成绩(test1,test2,test3)。给定一个一维数组,代表每次考试的权值,该一维数组为[0.25, 0.25, 0.5],计算每个同学的最终得分,并输出统计这n个同学最终成绩的一维数组。(每个同学的成绩保留小数点后两位小数)。

example:

input:

4

87 75 60

66 98 100

70 65 72

67 77.5 80

output:

[70.5, 91.0, 69.75, 76.12]

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let n: i32 = input.trim().parse().expect("Failed to parse input");
 7    input.clear();
 8
 9    let mut result: Vec<f64> = Vec::new();
10    for _ in 0..n {
11        stdin().read_line(&mut input).expect("Failed to read line");
12        let scores: Vec<f64> = input
13            .split_whitespace()
14            .map(|s| s.parse().unwrap())
15            .collect();
16        let weighted_sum: f64 = scores
17            .iter()
18            .zip(vec![0.25, 0.25, 0.5].iter())
19            .map(|(&w, &v)| format!("{:.2}", w * v).parse::<f64>().unwrap())
20            .sum();
21        result.push(weighted_sum);
22        input.clear();
23    }
24    println!("{:?}", result);
25}
  1. 计算小于n的最大素数。输入n的值小于等于2时,输出None

input:

100

output:

97

input:

200

output:

199

input:

2

output:

None

 1use std::io::stdin;
 2
 3fn is_prime(n: i32) -> bool {
 4    if n <= 1 {
 5        return false;
 6    } else if n == 2 {
 7        return true;
 8    } else {
 9        for i in 2..(n as f64).sqrt() as i32 + 1 {
10            if n % i == 0 {
11                return false;
12            }
13        }
14        return true;
15    }
16}
17
18fn main() {
19    let mut input = String::new();
20    stdin().read_line(&mut input).expect("Failed to read line");
21    let n: i32 = input.trim().parse().expect("Failed to parse input");
22
23    if n <= 2 {
24        println!("None");
25    } else {
26        for i in (3..n).rev() {
27            if is_prime(i) {
28                println!("{i}");
29                break;
30            }
31        }
32    }
33}
  1. 从键盘输入一个n,代表打印杨辉三角的行数,且n >=3 ,编写一个程序,打印杨辉三角。

input:

3

output:

[1]

[1, 1]

[1, 2, 1]

input:

5

output:

[1]

[1, 1]

[1, 2, 1]

[1, 3, 3, 1]

[1, 4, 6, 4, 1]

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let n: i32 = input.trim().parse().expect("Failed to parse input");
 7
 8    let mut current: Vec<i32> = vec![1];
 9
10    println!("{:?}", current);
11    if n == 1 {
12        return;
13    }
14
15    for i in 2..n + 1 {
16        let previous = current.clone();
17        current = vec![1];
18        for j in 1..(i - 1) as usize {
19            current.push(previous[j - 1] + previous[j]);
20        }
21        current.push(1);
22        println!("{:?}", current);
23    }
24}
  1. 编写一个函数能够判断两个字符串的最长前缀码,比如:distance和distinct的最长

前缀码为dist,如果输入的两个字符串没有相同的前缀码则返回None。

input:

distance

distinct

output:

dist

input:

student

teacher

output

None

input:

version

versus

output:

vers

 1use std::cmp::min;
 2use std::io::stdin;
 3
 4fn main() {
 5    let mut input = String::new();
 6    stdin().read_line(&mut input).expect("Failed to read line");
 7    let word_a: String = input.trim().to_string();
 8    input.clear();
 9    stdin().read_line(&mut input).expect("Failed to read line");
10    let word_b: String = input.trim().to_string();
11
12    let mut result = String::new();
13    let mut matched = true;
14    let mut i = 0;
15    while matched && i < min(word_a.len(), word_b.len()) {
16        if word_a.chars().nth(i).unwrap() == word_b.chars().nth(i).unwrap() {
17            result.push(word_a.chars().nth(i).unwrap());
18            i += 1;
19        } else {
20            matched = false;
21        }
22    }
23
24    if i == 0 {
25        println!("None");
26    } else {
27        println!("{}", result);
28    }
29}
  1. 因式分解,输入一个数,判断其实素数还是合数,如果是合数,将所有的因式分解打印出来,如:12=1*12 12=2*6 12=3*4

如果是素数:

input:

17

output:

17 is Prime

input:

20

output:

20=1*20 20=2*10 20=4*5

 1use std::io::stdin;
 2
 3fn is_prime(n: i32) -> bool {
 4    if n <= 1 {
 5        return false;
 6    } else if n == 2 {
 7        return true;
 8    } else {
 9        for i in 2..(n as f64).sqrt() as i32 + 1 {
10            if n % i == 0 {
11                return false;
12            }
13        }
14        return true;
15    }
16}
17
18fn main() {
19    let mut input = String::new();
20    stdin().read_line(&mut input).expect("Failed to read line");
21    let n = input.trim().parse::<i32>().expect("Invalid input");
22
23    if is_prime(n) {
24        println!("{n} is prime");
25        return;
26    }
27
28    for i in 1..(n as f64).sqrt() as i32 + 1 {
29        let p: f64 = n as f64 / i as f64;
30        if p.fract() == 0.0 {
31            print!("{}={}*{} ", n, i, p as i32);
32        }
33    }
34}
  1. 编写函数,接收一个正偶数为参数,输出两个素数,并且这两个素数之和等于原来的正偶数。如果存在多组符合条件的素数,则全部输出。

如果输入的不是正偶数,打印输入错误。

input:

20

output:

20=3+17

20=7+13

20=13+7

20=17+3

input:

9

output:

input error!

 1use std::io::stdin;
 2
 3fn is_prime(n: i32) -> bool {
 4    if n <= 1 {
 5        return false;
 6    } else if n == 2 {
 7        return true;
 8    } else {
 9        for i in 2..(n as f64).sqrt() as i32 + 1 {
10            if n % i == 0 {
11                return false;
12            }
13        }
14        return true;
15    }
16}
17
18fn main() {
19    let mut input = String::new();
20    stdin().read_line(&mut input).expect("Failed to read line");
21    let n = input.trim().parse::<i32>().expect("Invalid input");
22
23    if n % 2 != 0 {
24        println!("Input Error!");
25        return;
26    }
27
28    for i in 3..n - 2 {
29        if is_prime(i) && is_prime(n - i) {
30            println!("{}={}+{}", n, i, n - i);
31        }
32    }
33}
  1. 凯撒密码(Caesar Cypher)是一个比较弱的加密形式,它涉及将单词中的每个字母“轮转”固定数量的位置。轮转一个字母意思是在字母表中移动它,如果需要,再从开头开始。所以‘A’轮转3个位置是’D‘,而’Z‘轮转一个位置是’A‘。

要对一个单词进行轮转操作,对其中每一个字母进行轮转即可。例如,“cheer”轮转7位的结果是“jolly”,而“melon”轮转-10位结果是“cubed”。在电影《2001太空漫游》中,舰载机器人叫作HAL,这个单词正是IBM轮转-1位的结果。

编写一个函数rotate_word,接收一个字符串以及一个整数作为参数,并返回一个新字符串,其中的字母按照给定的整数值“轮转”位置。

input:

izieisie

5

output:

nenjnxnj

 1use std::io::stdin;
 2
 3fn caesar_encrypt(plaintext: &str, key: i32) -> String {
 4    let mut ciphertext = String::new();
 5    for c in plaintext.chars() {
 6        let base = if c.is_ascii_lowercase() { 'a' } else { 'A' };
 7        let encrypted_char =
 8            (((c as u32 - base as u32 + key as u32) % 26) + base as u32) as u8 as char;
 9        ciphertext.push(encrypted_char);
10    }
11    ciphertext
12}
13
14fn main() {
15    let mut input = String::new();
16    stdin().read_line(&mut input).expect("Failed to read line");
17    let plaintext = input.trim();
18
19    let mut input = String::new();
20    stdin().read_line(&mut input).expect("Failed to read line");
21    let key = input.trim().parse::<i32>().expect("Invalid key");
22
23    let ciphertext = caesar_encrypt(plaintext, key);
24    println!("{}", ciphertext);
25}
  1. 从键盘输入一个十进制数n,再输入一个需要转换的进制数,输出十进制转换成对应进制的数。如果输入的转换进制不是2或8或16,输出错误提示。

example:

input:

32

2

output:

100000

input:

32

8

output:

40

input:

32

16

output:

20

input:

32

5

output:

Error!please input correct number(2 or 8 or 16)

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let number: i32 = input.trim().parse().expect("Failed to parse input");
 7    input.clear();
 8    stdin().read_line(&mut input).expect("Failed to read line");
 9    let numeration: i32 = input.trim().parse().expect("Failed to parse input");
10
11    match numeration {
12        2 => {
13            println!("{}", format!("{:b}", number));
14        }
15        8 => {
16            println!("{}", format!("{:o}", number));
17        }
18        16 => {
19            println!("{}", format!("{:X}", number));
20        }
21        _ => {
22            println!("Error! Please input correct number(2 or 8 or 16).");
23        }
24    }
25}
  1. 从键盘接收一个由空格分隔的字符串如:AAF H D,将其存在数组中,第一个是需要转换进制的数值,第二个是当前的进制,第三个是需要转换的进制。输出转换的结果。(B代表二进制 , D代表十进制,O代表八进制,H代表十六进制)

example:

input:

23 D H

output:

17

input:

1011 B O

output:

13

input:

1011 H D

output:

4113

 1use std::io::stdin;
 2
 3fn to_decimal(number: &str, base: &str) -> i32 {
 4    match base {
 5        "B" => i32::from_str_radix(number, 2).unwrap(),
 6        "O" => i32::from_str_radix(number, 8).unwrap(),
 7        "D" => number.parse::<i32>().unwrap(),
 8        "H" => i32::from_str_radix(number, 16).unwrap(),
 9        _ => -1,
10    }
11}
12
13fn from_decimal(number: i32, base: &str) -> String {
14    match base {
15        "B" => format!("{:b}", number),
16        "O" => format!("{:o}", number),
17        "D" => number.to_string(),
18        "H" => format!("{:x}", number),
19        _ => String::from("Invalid Base"),
20    }
21}
22
23fn main() {
24    let mut input = String::new();
25    stdin().read_line(&mut input).expect("Failed to read line");
26    let vec: Vec<&str> = input.split_whitespace().collect();
27    let decimal = to_decimal(vec[0], vec[1]);
28    let result = from_decimal(decimal, vec[2]);
29    println!("{}", result);
30}
  1. 编写一个程序计算c的值,$c=\sqrt{a^2+b^2-2abcosc}$,从键盘输入一个a,一个b,一个r,输出c的值。(保留两位小数)

example:

input:

2.5

3.4

90

output:

5.04

 1use std::io::stdin;
 2
 3fn input() -> f64 {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let num: f64 = input.trim().parse().expect("Invalid input");
 7    num
 8}
 9
10fn main() {
11    let a = input();
12    let b = input();
13    let r = input();
14    println!(
15        "{}",
16        format!("{:.2}", (a * a + b * b - 2.0 * a * b * r.cos()).sqrt())
17    );
18}
  1. 从键盘输入一组由单词和空格组成的长字符串,统计字符串中不包括元音字母的单词个数。

example:

input:

word by word

output:

1

 1use std::io::{stdin, BufRead};
 2
 3fn has_vowel(word: &str) -> bool {
 4    let vowels = "aeiouAEIOU";
 5    for c in word.chars() {
 6        if vowels.contains(c) {
 7            return true;
 8        }
 9    }
10    return false;
11}
12
13fn main() {
14    let mut count = 0;
15    for s in stdin()
16        .lock()  // StdinLock<'static>
17        .lines()  // Lines<StdinLock<'static>>
18        .next()  // Option<Result<String, Error>>
19        .unwrap()  // Result<String, Error>
20        .unwrap()  // String
21        .split_whitespace()  // &str
22    {
23        if has_vowel(s) {
24            count += 1;
25        }
26    }
27    println!("{count}");
28}
  1. 输入一个由秒组成的字符串例如15678s,转换成小时分秒输出,或输入一个小时组成的字符串3.56h,转换成秒输出。

example:

input:

15678s

output:

Total time is: 4 hour 21 minute 18 second

input:

3.56h

output:

Total second is: 12816

 1use std::io::stdin;
 2
 3fn second2hour(total: i32) -> Vec<i32> {
 4    let second = total % 60;
 5    let minute = (total / 60) % 60;
 6    let hour = total / 3600;
 7    vec![hour, minute, second]
 8}
 9
10fn hour2second(hour: f64) -> i32 {
11    (hour * 3600.0) as i32
12}
13
14fn main() {
15    let mut input = String::new();
16    stdin().read_line(&mut input).expect("Failed to read line");
17    let time = input.trim();
18    if time.chars().last().unwrap() == 's' {
19        let second = time
20            .chars()
21            .take(time.len() - 1)
22            .collect::<String>()
23            .parse::<i32>()
24            .unwrap();
25        let result = second2hour(second);
26        println!(
27            "{} hours {} minutes {} seconds",
28            result[0], result[1], result[2]
29        );
30    } else {
31        let hour = time
32            .chars()
33            .take(time.len() - 1)
34            .collect::<String>()
35            .parse::<f64>()
36            .unwrap();
37        let result = hour2second(hour);
38        println!("{} seconds", result);
39    }
40}
  1. 从键盘输入一个n,打印与n相关的图像。具体图形见例子。
 1example:
 2
 3input:
 43
 5output:
 6*
 7**
 8***
 9
10input:
116
12output:
13*
14**
15***
16****
17*****
18******
 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let n = input.trim().parse::<i32>().expect("Invalid input");
 7
 8    let asterisk = "*";
 9    for i in 1..=n as usize {
10        println!("{}", asterisk.repeat(i));
11    }
12}
  1. 编写一个程序,从键盘输入一行一维数组,一行符号,一行数字,根据符号,计算一维数组值的改变。输入符号只有四种,分别为“+”“-”“*”“/”,当符号为“/”时,判断一维数组中的每个元素是什么类型,如果每个元素都为int型数据,输出的一维数组中每一项,为整除的结果,即输出的一维数组中每一项的值都为int型,如果一维数组中至少包含一个float型数据,则输出的一维数组中每个元素都为float型数据。

example:

input:

[1,2,3,4]

+

3

output:

[4,5,6,7]

input:

[1,2,3,4]

*

3

output:

[3,6,9,12]

input:

[1,2,3,4]

/

2

output:

[0,1,1,2]

input:

[1.0,2,3,4]

/

2

output:

[0.5, 1.0, 1.5, 2.0]

 1use serde_json; // 第三方 serde_json 库
 2use std::io::stdin;
 3
 4fn main() {
 5    let mut input = String::new();
 6    stdin().read_line(&mut input).unwrap();
 7    let vec_str: String = input.trim().to_string();
 8    input.clear();
 9
10    stdin().read_line(&mut input).unwrap();
11    let sign: String = input.trim().to_string();
12    input.clear();
13
14    stdin().read_line(&mut input).unwrap();
15    let num: i32 = input.trim().parse().unwrap();
16    input.clear();
17
18    if vec_str.contains(".") {
19        let vec: Vec<f64> = serde_json::from_str(&vec_str.trim()).unwrap();
20        println!(
21            "{:?}",
22            vec.iter().map(|f| f / num as f64).collect::<Vec<f64>>()
23        );
24    } else {
25        let vec: Vec<i32> = serde_json::from_str(&vec_str.trim()).unwrap();
26        match sign.as_str() {
27            "+" => {
28                println!("{:?}", vec.iter().map(|i| i + num).collect::<Vec<i32>>());
29            }
30            "-" => {
31                println!("{:?}", vec.iter().map(|i| i - num).collect::<Vec<i32>>());
32            }
33            "*" => {
34                println!("{:?}", vec.iter().map(|i| i * num).collect::<Vec<i32>>());
35            }
36            "/" => {
37                println!("{:?}", vec.iter().map(|i| i / num).collect::<Vec<i32>>());
38            }
39            _ => {
40                return;
41            }
42        }
43    }
44}
  1. 某公司有n千万元可以用于对a,b,c三个项目的投资。假设每年投资一个项目,投资的规则是:或者对a投资1千万,或者对b投资2千万,或者对c投资2千万,从键盘输入一个n,代表投资的n千万,输出可以得到的总的方案数有多少个。 将该问题转换为递归公式,可以写成:$f(n)=f(n-1)+2f(n-2)$,其中f(1)=1,f(2)=3。

example:

input:

3

output:

5

input:

10

output:

683

 1use std::io::stdin;
 2
 3fn func(n: i32) -> i32 {
 4    if n == 1 {
 5        return 1;
 6    } else if n == 2 {
 7        return 3;
 8    } else {
 9        return func(n - 1) + 2 * func(n - 2);
10    }
11}
12
13fn main() {
14    let mut input = String::new();
15    stdin().read_line(&mut input).expect("Failed to read line");
16    let n: i32 = input.trim().parse().expect("Failed to parse input");
17
18    println!("{}", func(n));
19}
  1. 输入两行数据,第一个包含一个整数n,表示数列中整数的个数。 第二行包含n个整数a1,a2,a3,……an,表示给定的数列,相邻的整数之间用一个空格分割。输出一个整数,表示给定的数列有多少段。

example:

input:

8

8 8 8 0 12 12 8 0

output:

5

注:8 8 8 是第一段,0 是第二段,12 12 是第三段 ,8 是第四段,最后一个 0 是第五段。

 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let nums: Vec<i32> = input
 7        .trim()
 8        .split_whitespace()
 9        .map(|s| s.trim().parse::<i32>().unwrap())
10        .collect();
11
12    let mut count = 1;
13    for i in 1..nums.len() {
14        if nums[i] != nums[i - 1] {
15            count += 1;
16        }
17    }
18    println!("{count}");
19}
  1. 从键盘输入一个未排序的一维数组,利用选择排序对其进行排序,输出每一次选择排序后得到的一维数组序列。选择排序的执行原理是扫描整个无序序列,将最小元素与无序序列索引0的位置做交换。第二次选择剩余无序序列中最小的元素与索引是1的位置交换,以此类推,直到最后一次选择剩余无序序列中最小的元素与索引是len-1的位置做交换。
 1example:
 2
 3input:
 4[6,2,7,5,4,1,3]
 5output:
 6[1, 2, 7, 5, 4, 6, 3]
 7[1, 2, 7, 5, 4, 6, 3]
 8[1, 2, 3, 5, 4, 6, 7]
 9[1, 2, 3, 4, 5, 6, 7]
10[1, 2, 3, 4, 5, 6, 7]
11[1, 2, 3, 4, 5, 6, 7]
12
13input:
14[22,8,16,5,14,17]
15output:
16[5, 8, 16, 22, 14, 17]
17[5, 8, 16, 22, 14, 17]
18[5, 8, 14, 22, 16, 17]
19[5, 8, 14, 16, 22, 17]
20[5, 8, 14, 16, 17, 22]
 1use serde_json;
 2use std::io::stdin;
 3
 4fn main() {
 5    let mut input = String::new();
 6    stdin().read_line(&mut input).unwrap();
 7    let mut vec: Vec<i32> = serde_json::from_str(&input).unwrap();
 8
 9    for i in 0..vec.len() - 1 {
10        let min = vec[i..].iter().min().unwrap();
11        let min_index = vec[i..].iter().position(|i| i == min).unwrap() + i;
12        vec.swap(i, min_index);
13        println!("{:?}", vec);
14    }
15}
  1. 问题描述

  求出区间[a,b]中所有整数的质因数分解。其中:b > a > 1,且a,b皆为正整数。

输入格式

  输入两个整数a,b。

输出格式

  每行输出一个数的分解,形如k=a1a2a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)

 1样例输入
 2
 33 10
 4
 5样例输出
 6
 73=3
 84=2*2
 95=5
106=2*3
117=7
128=2*2*2
139=3*3
1410=2*5
 1use std::io::stdin;
 2
 3fn is_prime(n: i32) -> bool {
 4    if n < 2 {
 5        return false;
 6    } else {
 7        for i in 2..n {
 8            if n % i == 0 {
 9                return false;
10            }
11        }
12        return true;
13    }
14}
15
16fn pfd(num: i32) -> Vec<i32> {
17    let mut n = num;
18    let mut result = Vec::new();
19    while !is_prime(n) && n > 1 {
20        for i in 2..n {
21            if n % i == 0 && is_prime(i) {
22                result.push(i);
23                n /= i;
24                break;
25            }
26        }
27    }
28    result.push(n);
29    return result;
30}
31
32fn main() {
33    let mut input = String::new();
34    stdin().read_line(&mut input).unwrap();
35    let tmp: Vec<i32> = input
36        .split_whitespace()
37        .map(|s| s.parse::<i32>().unwrap())
38        .collect();
39    let a = tmp[0];
40    let b = tmp[1];
41    for i in a..b + 1 {
42        print!("{i}=");
43        let factors: Vec<String> = pfd(i).iter().map(|i| i.to_string()).collect();
44        print!("{}\n", factors.join("*"));
45    }
46}
  1. 请编写程序,实现一下功能:从键盘输入一个n,代表二维数组的行和列,输入n行数列,每行的数列中包括n个数字。判断该矩阵是不是交错矩阵,如果是交错矩阵返回一个True,否则返回Flase。所谓交错矩阵,就是当前矩阵与它的转置矩阵的和为零矩阵。例如:

$$ \begin{bmatrix} 0 & -3 & 7 \\ 3 & 0 & 9 \\ -7 & -9 & 0 \end{bmatrix} \quad \text{与} \quad \begin{bmatrix} 0 & 3 & -7 \\ -3 & 0 & -9 \\ 7 & 9 & 0 \end{bmatrix} $$

互为交错矩阵,它们的转置矩阵与自身的和为全零的矩阵。

 1example:
 2
 3input:
 43
 50 -3 7
 63 0 9
 7-7 -9 0
 8output:
 9True
10
11input:
123
130 3 7
143 0 9
157 9 0
16output:
17False
 1use std::io::stdin;
 2
 3fn main() {
 4    let mut input = String::new();
 5    stdin().read_line(&mut input).expect("Failed to read line");
 6    let odr: i32 = input.trim().parse().unwrap();
 7
 8    let mut mat: Vec<Vec<i32>> = Vec::new();
 9    for _ in 0..odr {
10        input.clear();
11        stdin().read_line(&mut input).expect("Failed to read line");
12        let row: Vec<i32> = input
13            .trim()
14            .split_whitespace()
15            .map(|x| x.parse().unwrap())
16            .collect();
17        mat.push(row);
18    }
19
20    for i in 0..odr as usize {
21        for j in 0..odr as usize {
22            if mat[i][j] + mat[j][i] != 0 {
23                println!("False");
24                return;
25            }
26        }
27    }
28    println!("True");
29}

相关系列文章