验证是否素数 #
先验证\(1、2、3\),且\(6=2*3\),接下来只需验证\(6n-1\)与\(6n+1\)
int is_prime(int n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 1;
if (n % 2 == 0 || n % 3 == 0)
return 0;
for (int i = 5; i * i <= n; i += 6)
if (n % i == 0 || n % (i + 2) == 0)
return 0;
return 1;
}
strcpy 和 strdup 基本用法 #
strcpy
和 strdup
都是用于处理字符串的 C 函数,它们的功能相似,但用法略有不同。
strcpy
(String Copy):strcpy
用于将一个字符串(字符数组)的内容复制到另一个字符数组中。- 它的原型为
char* strcpy(char* dest, const char* src)
。 dest
是目标字符串,src
是源字符串。strcpy
将src
的内容复制到dest
中,直到遇到空字符'\0'
为止。- 注意:
strcpy
不会检查目标数组是否足够大来容纳源字符串的内容,这可能导致缓冲区溢出。因此,在使用strcpy
时,必须确保目标数组足够大,以免发生溢出。
示例:
char source[] = "Hello, World!";
char destination[20];
strcpy(destination, source);
strdup
(String Duplicate):strdup
用于复制一个字符串,并为新字符串分配足够的内存空间。strdup
并不是标准 C 函数,但它是一种常见的库函数,通常在 POSIX 环境中可用。strdup
的原型通常为char* strdup(const char* str)
。- 它接受一个源字符串
str
,并动态分配足够的内存来存储它,并将其内容复制到新分配的内存中。 - 返回值是指向新字符串的指针,你需要负责在使用后释放这个内存,通常使用
free
函数。
示例:
char source[] = "Hello, World!";
char* duplicate = strdup(source);
// 使用 duplicate
free(duplicate); // 释放内存,以避免内存泄漏
总结:
strcpy
用于在已分配的内存中复制字符串,需要手动分配目标数组的内存和确保足够大。strdup
用于复制字符串并动态分配内存,更方便,但需要手动释放内存以避免内存泄漏。
1008 数组元素循环右移问题 #
注意\(M\) 可能会大于\(N\),即\(M=kN+a\),\(M\)中大于\(N\)的\(kN\)部分只是循环,并无意义, 令\(M \equiv M \mod N\)即可,接下来只要从数组的第\(M\)项存第一个数,\(n - m\)项之后开始在数组的第一位存数字
- c 语言版
#include <stdio.h>
int main()
{
int n = 0, m = 0, q = 0;
scanf("%d %d", &n, &m);
m = m % n;
int a[n];
for (int i = 0; i < n; i++) {
int t = 0;
scanf("%d", &t);
if (i < n - m)
a[m + i] = t;
else {
a[i - (n - m)] = t;
}
}
for (int i = 0; i < n; i++) {
if (q == 0) {
printf("%d", a[i]);
q = 1;
} else {
printf(" %d", a[i]);
}
}
}
- rust版
use std::io;
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Can't read line");
let mut input = input.trim().split_whitespace();
let n: i32 = input.next().expect("Error").parse().expect("Not a num");
let mut m: i32 = input.next().expect("Error").parse().expect("Not a num");
m = m % n;
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Can't read line");
let mut a: Vec<i32> = input
.trim()
.split_whitespace()
.map(|n| n.parse().expect("Not a num!"))
.collect();
let len = a.len();
let vec_move = a.split_off(len - m as usize);
a.splice(0..0, vec_move);
a.into_iter().enumerate().for_each(|(idx, n)| {
if idx == 0 {
print!("{}", n)
} else {
print!(" {}", n);
}
})
}