【C语言精选函数结构体代码题】

C语言精选函数结构体代码题

五、函数

5.1最大公约数🚀

c 复制代码
#include <stdio.h>
//greatest common divisor
//普通搜索方法求最大公约数
int gcd1(int a, int b){
    //初始化认为最大公约数就是a,b之中较小的那个
    int result = a < b ? a : b;
    //暴力往前搜素,第一个符合条件的就是最大公约数
    while(result > 0) {
        if(a % result == 0 && b % result == 0){
            return result;
        }
        result--;
    }
}

//辗转相除法
int gcd2(int a, int b){
    int remainder = a % b;
    while(remainder != 0){
        a = b;
        b = remainder;
        remainder = a % b;
    }
    return b;
}

//辗转相除法递归
int gcd3(int m, int n){
    if(n == 0)
        return m;
    else
        return gcd3(n, m % n);
}

int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", gcd1(a, b));
    return 0;
}

辗转相除法背过就好了

5.2最小公倍数

c 复制代码
#include <stdio.h>

// 求最大公约数函数(辗转相除法)
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    // 利用公式:最小公倍数 = (m * n) / 最大公约数
    int lcm = (m * n) / gcd(m, n); 
    printf("%d\n", lcm);
    return 0;
}

最小公倍数 = (m * n) / 最大公约数

5.3斐波那契

c 复制代码
#include <stdio.h>
//递归斐波那契数列
int fb(int n) {
    if(n==1||n==2){
		return 1;
	}
	return fb(n-1)+fb(n-2);
}

int main() {
    int n,m,i=1;
    scanf("%d", &n);  // 输入两个整数
	while(i<=n){
		m=fb(i++);
		printf("%d ",m);
	}
    return 0;
}

斐波那契数列一般就是递归算法入门时的一个案例,要点就是想好终止条件和递归代码

5.4汉诺塔🚀🚀🚀

c 复制代码
#include <stdio.h>

// 递归函数解决汉诺塔问题
void hanoi(int n, char from_rod, char aux_rod, char to_rod) {
    if (n == 1) {  // 基本情况:只有1个盘子时直接移动
        printf("Move disk 1 from rod %c to rod %c\n", from_rod, to_rod);
        return;
    }
    // 将n-1个盘子从from_rod借助to_rod移动到aux_rod
    hanoi(n - 1, from_rod, to_rod, aux_rod);
    // 移动第n个盘子
    printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
    // 将n-1个盘子从aux_rod借助from_rod移动到to_rod
    hanoi(n - 1, aux_rod, from_rod, to_rod);
}

int main() {
    int n;
    scanf("%d", &n);  // 输入盘子数量
    hanoi(n, 'A', 'B', 'C');  // 调用函数,A为起始柱,C为目标柱
    return 0;
}

核心思路:递归分解问题

汉诺塔的递归逻辑基于一个关键思想:把复杂问题拆解为规模更小的同类问题。对于 n 个盘子,操作可拆分为三步:
将前 n-1 个盘子从起始柱(A)借助目标柱(C)移动到辅助柱(B)

(此时问题规模缩小为 n-1,但柱子的 "角色" 变化:原本的目标柱 C 变成辅助柱,B 成为新的目标柱)。
将第 n 个盘子直接从起始柱(A)移动到目标柱(C)

(这是唯一能直接操作的步骤,因为第 n 个盘子最大,可直接移动)。
将前 n-1 个盘子从辅助柱(B)借助起始柱(A)移动到目标柱(C)

(再次处理规模为 n-1 的问题,柱子角色又变化:A 成为辅助柱,C 是目标柱)。


5.5n的阶乘🚀

c 复制代码
#include <stdio.h>
int factorial(int n) {
    if (n == 0) {  //注意0的阶乘是1!
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}
int main() {
    int n;
    scanf("%d", &n);
    int result = factorial(n);
    printf("%d", result);
    return 0;
}

0的阶乘是1

六、结构体

6.1学生信息结构体🚀🚀🚀

c 复制代码
#include <stdio.h>
#include <string.h>

struct Student {
    char name[11];
    char gender[11];
    int age;
    char student_id[11];
};  //别忘了这里的分号!

int main() {
    int n;
    scanf("%d", &n);
    struct Student students[n];
    for (int i = 0; i < n; i++) {
        scanf("%s %s %d %s", students[i].name, students[i].gender, &students[i].age, students[i].student_id);
        for (int j = 0; j < i; j++) {  //检查是否有重复的ID
            if (strcmp(students[i].student_id, students[j].student_id) == 0) {
                printf("Student ID already exists. Please enter a unique ID.\n");
                i--; //重新录入
                break;
            }
        }
    }
    printf("%-10s %-10s %-10s %-10s\n", "Name", "Gender", "Age", "Student ID");
    for (int i = 0; i < n; i++) {
        printf("%-10s %-10s %-10d %-10s\n", students[i].name, students[i].gender, students[i].age, students[i].student_id);
    }
    return 0;
}

6.2 共有体案例

c 复制代码
#include <stdio.h>
union Data {
    int intData;
    double doubleData;
    char charData;
};
int main() {
    union Data myData;
    int choice;
    scanf("%d", &choice);
    switch(choice) { 
        case 1:
            scanf("%d", &myData.intData);
            printf("有效数据为:%d\n", myData.intData);
            printf("共用体的字节大小为:%lu\n", sizeof(myData));
            break;
        case 2:
            scanf("%lf", &myData.doubleData);
            printf("有效数据为:%.4lf\n", myData.doubleData);
            printf("共用体的字节大小为:%lu\n", sizeof(myData));
            break;
        case 3:
            scanf(" %c", &myData.charData);
            printf("有效数据为:%c\n", myData.charData);
            printf("共用体的字节大小为:%lu\n", sizeof(myData));
            break;
        default:
            printf("无效选择\n");
    }
    return 0;
}


6.3枚举类型使用案例

c 复制代码
#include <stdio.h>
// 定义枚举类型表示不同颜色
enum Color {
    RED=1,
    GREEN,
    BLUE
};  //注意里面是逗号

int main() {
    enum Color selectedColor;
    int colorNum;
    // 输入数字代表颜色
    scanf("%d", &colorNum);
    // 根据输入的数字选择对应的颜色
    switch(colorNum) {
        case RED:
            printf("选择的颜色是红色");
            break;
        case GREEN:
            printf("选择的颜色是绿色");
            break;
        case BLUE:
            printf("选择的颜色是蓝色");
            break;
        default:
            printf("无效输入");
    }
    return 0;
}


6.4 位运算的使用案例

c 复制代码
#include <stdio.h>

int main() {
    int num1, num2;
    // 输入两个整数
    scanf("%d %d", &num1, &num2);
    // 与运算
    printf("与运算结果:%d\n", num1 & num2);
    // 或运算
    printf("或运算结果:%d\n", num1 | num2);
    // 异或运算
    printf("异或运算结果:%d\n", num1 ^ num2);
    // 取反运算
    printf("取反运算结果:%d\n", ~num1);
    // 左移两位
    printf("左移两位结果:%d\n", num1 << 2);
    // 右移两位
    printf("右移两位结果:%d\n", num1 >> 2);
    return 0;
}

6.5文件操作

c 复制代码
#include <stdio.h>

int main() {
    // 读取刚才创建的文件
    FILE* input_1 = fopen("input_1.txt", "r");
    if (input_1 == NULL) {
        return 0;
    }
    // 创建文件(拷贝目标)
    FILE* output_1 = fopen("output_1.txt", "w");
    if (output_1 == NULL) {  // 这里原代码判断条件错误,应为output_1,修正后抄写
        return 0;
    }
    // 开始操作
    char ch = 0;
    while (1) {
        // 复制
        ch = fgetc(input_1);
        if (ch == EOF)
            break;
        // 粘贴
        fputc(ch, output_1);
    }
    // 关闭文件
    fclose(input_1);
    fclose(output_1);
    return 0;
}
相关推荐
Swift社区17 分钟前
Swift 并发中的任务让步(Yielding)和防抖(Debouncing)
开发语言·ios·swift
噜啦噜啦嘞好24 分钟前
C++之list类及模拟实现
开发语言·c++·list
Yasen^o32 分钟前
C++编译汇编八股总结
开发语言·汇编·c++
Java版蜡笔小新33 分钟前
数字与静态
java·开发语言·学习
Cindy辛蒂1 小时前
C语言:能够规定次数,处理非法字符的猜数游戏(三重循环)
c语言·算法·游戏
X_Eartha_8151 小时前
(C++)STL-list
开发语言·c++
爱的叹息1 小时前
Feture常见实现类(FutureTask、CompletableFuture、ListenableFuture)对比
java·开发语言·python
小卡皮巴拉1 小时前
【力扣刷题实战】无重复的最长字串
开发语言·c++·算法·leetcode·滑动窗口
huangyuchi.1 小时前
map容器练习:使用map容器识别统计单词个数
开发语言·数据结构·c++·笔记·算法
啥都鼓捣的小yao1 小时前
Python解决“特定数组的逆序拼接”问题
开发语言·python·算法