1.交换
void swap(int *a,int *b) {
int t;
t = *a;
*a = *b;
*b = t;
}
2.斐波那契(递归)
int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
3.斐波那契(迭代)//更高效
int fibonacci(int n) {
int a = 0, b = 1, temp;
if (n == 0) {
return a;
}
for (int i = 2; i <= n; i++) {
temp = a + b;
a = b;
b = temp;
}
return b;
}
4.素数
int isPrime(int n) {
// 1 不是素数
if (n <= 1) {
return 0; // 返回 0 表示不是素数
}
// 2 是素数
if (n == 2) {
return 1; // 返回 1 表示是素数
}
// 如果 n 是偶数且大于 2,直接返回不是素数
if (n % 2 == 0) {
return 0;
}
for (int i = 3; i*i<= n; i += 2) {
if (n % i == 0) {
return 0; // 找到因子,返回不是素数
}
}
return 1; // 经过重重考验。没有找到因子,返回是素数
}
5.质因数
void primeFactors(int n) {
// 处理 2 这个特殊的质因数
while (n % 2 == 0) {
printf("%d ", 2);
n /= 2;
}
// 从 3 开始检查奇数因子
for (int i = 3; i * i <= n; i += 2) { // 只检查到 √n
while (n % i == 0) {
printf("%d ", i);
n /= i;
}
}
// 如果剩余的 n 是大于 2 的质数,直接输出它
if (n > 2) {
printf("%d ", n);
}
}
6.最大公约数&最小公倍数(辗转相除法)
公约数(Greatest Common Divisor, GCD):
两个整数的公约数是能够同时整除这两个整数的数。
最大的一个公约数叫做最大公约数。
公倍数(Least Common Multiple, LCM):两个整数的公倍数是能够同时被这两个整数整除的数。
最小的一个公倍数叫做最小公倍数。并且LCM=(a*b)/gcd。
//最大公约数
int gcd(int a,int b) {
while (b != 0) {
int temp = b; // 把b存进temp里面
b = a % b; // 一直到b = 0
a = temp;
}
return a;
}
//最小公约倍数
int lcm(int a,int b) {
return (a*b)/gcd(a,b);
}
7.阶乘(递归)
int factorial(int n) {
if (n == 0 || n == 1) {
return 1; // 0! 和 1! 都是 1
} else {
return n * factorial(n - 1); // 递归调用
}
}
8.阶乘(迭代)
int factorial(int n) {
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i; // 累积计算阶乘
}
return result;
}
9.字符串删指定字母
void RemoveChar(char *str,char removeChar) {
int i,j = 0;
int len = strlen(str);
for (i = 0; i < len; i++) {
if(str[i] != removeChar) {
str[j] = str[i];
j++;
}
}
str[j] = '\0';
}
10.字符串反转 //任何数组都适用
reverseString(char str[]) {
int length = strlen(str);
int start = 0;
int end = length - 1;
while (start<end) {
int temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
11.冒泡排序
bubbleSort(int a[],int n){
int i,j,t;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
12.选择排序
selectSort(int a[],int n){
int i,j,min;
for(i=0;i<n-1;i++){
min = i;
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min = j;
}
}
int t = a[i];
a[i] = a[min];
a[min] = t;
}
}
13.插入排序
insortSort(int a[],int n){
int i,j,key;
for(i=1;i<n;i++){
key = a[i];
j = i-1;
while(j>=0&&a[j]>key){
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
14.数组逆序输出 //同10另外一种方法
for (i = 0; i < n/2; ++i) {
t = a[i];
a[i] = a[n-i-1];
a[n-i-1] = t;
}
15.#define宏
#define mul(x) x*x
#define sw(x,y) {int t;t=x;x=y;y=t;}
#define LAG >
#define SMA <
#define EQ ==
16.#if,#ifdef,#ifndef
#if 指令用于检查一个常量表达式的值。
如果表达式的值为真(非零),则编译相应的代码,否则忽略该代码。
#endif 标记这个块的结束。
#ifdef 指令用于检查某个宏是否已经被定义过。
如果宏已经被定义,则编译该代码块,否则忽略。
#ifndef 指令是 #ifdef 的反向操作,它检查某个宏是否未定义。
如果宏未定义,则编译相应的代码,否则忽略。
#else 用于在 #if、#ifdef 或 #ifndef 条件失败时执行另外一段代码。
它通常和 #if 或 #ifdef 一起使用,提供两种选择:
条件为真时执行某段代码,条件为假时执行另一段代码。
17.取数右端4~7位
// 右移 4 位,使得我们需要的位对齐到最低位
// 使用掩码 0x0F 来提取这四位。二进制表示是 00001111 保留最低的 4 位
result = (a >> 4) & 0x0F;
18.字符串长度
int length(char *s) {
int i = 0;
while (*s != '\0') {
i++;
s++;
}
return i;
}
19.反转整数
while (num != 0) {
int digit = num % 10; // 获取最后一位数字
reversed = reversed * 10 + digit; // 将其添加到反转结果的末尾
num /= 10; // 去掉最后一位数字
}
20.指针的指针
int main()
{
const char *s[]={"man","woman","girl","boy","sister"};
const char **q;
int k;
for(k=0;k<5;k++)
{
q=&s[k]; /*在这里填入内容*/
printf("%s\n",*q);
}
return 0;
}
man
woman
girl
boy
sister
21.结构体找年龄最大
struct man{
char name[20];
int age;
}
person[3]={"li",18,"wang",25,"sun",22};
int main()
{
struct man *q,*p;
int i,m=0;
p=person;
for(i=0;i<3;i++)
{
if(m<p->age)
{
m=p->age;
q=p;
}
p++;
}
printf("%s %d\n",q->name,q->age);
}
22.字符串连接程序
char* strconnect(char *str1,char *str2)
{
char* str;
str=(char*)malloc(strlen(str1)+strlen(str2)+1);
str[0]='\0';
strcat(str,str1);
strcat(str,str2);
return str;
}
23.结构体变量传递(值传递)
//结果是 3,a
struct student{
int x;
char c;
} a;
f(struct student b){
b.x=20;
b.c='y';
}
int main(){
a.x=3;
a.c='a';
f(a);
printf("%d,%c",a.x,a.c);
}
24.结构体变量传递(指针传递)
//结果 20,y
struct student {
int x;
char c;
};
void f(struct student *b) {
b->x = 20;
b->c = 'y';
}
int main() {
struct student a;
a.x = 3;
a.c = 'a';
f(&a); // 传递 a 的地址给 f
printf("%d,%c", a.x, a.c); // 输出修改后的 a
return 0;
}
25.子串出现次数
int countSubString(char *str,char *substr){
int count = 0;
char *temp = str;
while((temp = strstr(temp,substr) )!= NULL){
count++;
temp++;
}
return count;
}