已完结:C语言期末考试专用,精华干货(from.C语言经典100题目)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_58645222/article/details/144520587
今日推荐