1 、筛选法求100以内的素数

#include<bits/stdc++.h>
#define MAX 100

void sieve_of_eratosthenes(bool prime[], int max) {
    // 初始化所有数为素数
    for (int i = 2; i <= max; i++) {
        prime[i] = true;
    }

    // 开始筛选
    for (int p = 2; p * p <= max; p++) {
        // 如果prime[p]未被标记为合数,则它是素数
        if (prime[p]) {
            // 标记所有p的倍数为合数
            for (int i = p * p; i <= max; i += p) {
                prime[i] = false;
            }
        }
    }
}

int main() {
    bool prime[MAX + 1];
    sieve_of_eratosthenes(prime, MAX);

    printf("100以内的素数有:\n");
    for (int i = 2; i <= MAX; i++) {
        if (prime[i]) {
            printf("%d ", i);
        }
    }
    printf("\n");

    return 0;
}

2、用选择法对100以内的数进行排序

#include<bits/stdc++.h>

void selectionSort(int arr[], int n) {
    int i, j, minIdx, temp;
    for (i = 0; i < n - 1; i++) {
        // 找到未排序部分的最小值
        minIdx = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIdx]) {
                minIdx = j;
            }
        }
        // 将最小值与当前未排序部分的第一个元素交换
        temp = arr[minIdx];
        arr[minIdx] = arr[i];
        arr[i] = temp;
    }
}

int main() {
    int arr[10] = { 34, 7, 23, 32, 5, 62, 32, 8, 19, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int i;

    printf("排序前的数组:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    selectionSort(arr, n);

    printf("排序后的数组:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    system("pause");
    return 0;
}

3、求一个3X3的整数矩阵对角线之和

#include<bits/stdc++.h>

int main() {
    // 直接给定一个3x3的整数矩阵
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int i;
    int sum = 0;

    // 计算主对角线和副对角线的和
    for (i = 0; i < 3; i++) {
        sum += matrix[i][i]; // 主对角线元素
        sum += matrix[i][2 - i]; // 副对角线元素
    }

    // 因为主对角线和副对角线在中心点重复计算了一次,所以需要减去这个重复的点
    sum -= matrix[1][1];

    printf("对角线之和为: %d\n", sum);

    system("pause");
    return 0;
}

4、将一个数插入一个有序数组,插入完成之后数组仍然有序

#include<bits/stdc++.h>

void insertAndSort(int arr[], int n, int num) {
    int i;
    // 找到插入位置
    for (i = n - 1; (i >= 0 && arr[i] > num); i--) {
        arr[i + 1] = arr[i]; // 向后移动元素
    }
    arr[i + 1] = num; // 插入新元素
}

int main() {
    int arr[6] = { 1, 3, 5, 7, 9 }; // 假设数组已经有序,并且有空间容纳一个新元素
    int n = 5;  // 当前数组的元素个数
    int num = 6;    // 要插入的数

    printf("原数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    insertAndSort(arr, n, num);

    printf("插入后的数组: ");
    for (int i = 0; i < n + 1; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    system("pause");
    return 0;
}

5、将一个有序数组的值按照逆序重新存放

例: 8, 6, 5, 4, 1 -> 1, 4, 5, 6, 8

#include<bits/stdc++.h>

void reverseArray(int arr[], int n) {
    int start = 0;
    int end = n - 1;
    while (start < end) {
        // 交换元素
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        // 移动指针
        start++;
        end--;
    }
}

int main() {
    int arr[] = { 8, 6, 5, 4, 1 }; // 假设数组已经有序
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    reverseArray(arr, n);

    printf("逆序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");


    system("pause");
    return 0;
}

6、输出10行杨辉三角

#include<bits/stdc++.h>

#define ROWS 10

void generatePascalsTriangle(int arr[ROWS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0 || j == i) {
                arr[i][j] = 1; // 每行的第一个和最后一个元素为1
            }
            else {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; // 其他元素为上两元素之和
            }
        }
    }
}

void printPascalsTriangle(int arr[ROWS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int pascalsTriangle[ROWS][ROWS] = { 0 }; // 初始化二维数组

    generatePascalsTriangle(pascalsTriangle); // 生成杨辉三角
    printPascalsTriangle(pascalsTriangle); // 输出杨辉三角

    system("pause");
    return 0;
}

7、输出魔方阵

#include<bits/stdc++.h>

// 定义魔方阵的阶数
#define ROW 5
#define COL ROW

void generateMagicSquare() {
	int arr[ROW][COL] = { 0 };

	int currow = 0;
	int curcol = COL / 2;
	arr[0][curcol] = 1;//将1放于第一行中间

	for (int i = 2; i <= ROW * COL; i++)
	{
		//判断上一行下一列是否存在元素
		if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] != 0)
		{
			//存在元素,将位置挪位现位置的底下
			currow = (currow + 1) % ROW;
		}
		else
		{
			//不存在元素,挪位至现位置上一行下一列
			currow = (currow - 1 + ROW) % ROW;
			curcol = (curcol + 1) % COL;
		}
		arr[currow][curcol] = i;//为确定的位置赋值
	}

	//输出
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%-4d", arr[i][j]);
		}
		printf("\n");
	}

}

int main() {
	generateMagicSquare();
	system("pause");
	return 0;
}

8、判断一个二维数组是否有鞍点,有的话输出

#include<bits/stdc++.h>

#define ROWS 5
#define COLS 5

void findSaddlePoint(int arr[ROWS][COLS]) {
    int i, j, k;
    int isSaddlePoint = 0; // 标记是否找到鞍点

    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            // 检查当前元素是否是其所在行的最大值
            int maxInRow = 1;
            for (k = 0; k < COLS; k++) {
                if (arr[i][k] > arr[i][j]) {
                    maxInRow = 0;
                    break;
                }
            }

            // 检查当前元素是否是其所在列的最小值
            int minInCol = 1;
            for (k = 0; k < ROWS; k++) {
                if (arr[k][j] < arr[i][j]) {
                    minInCol = 0;
                    break;
                }
            }

            // 如果两个条件都满足,则该元素是鞍点
            if (maxInRow && minInCol) {
                printf("鞍点位于位置 (%d, %d),值为 %d\n", i, j, arr[i][j]);
                isSaddlePoint = 1;
            }
        }
    }

    if (!isSaddlePoint) {
        printf("数组中没有找到鞍点。\n");
    }
}

int main() {
    int arr[ROWS][COLS] = {
        {12, 7, 9, 66, 15},
        {8, 13, 6, 99, 10},
        {16, 17, 18, 77, 20},
        {21, 22, 23, 88, 25},
        {26, 27, 28, 99, 30}
    };

    findSaddlePoint(arr);

	system("pause");
	return 0;
}

9. 通过二分查找,在一个15个元素的数组中找出输入的数,如果没有则输出无此数

#include<bits/stdc++.h>

int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid + 1; // 返回第几个数,从1开始计数
        }
        else if (arr[mid] > target) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1; // 表示未找到
}

int main() {
    int arr[15] = { 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2 };
    int size = sizeof(arr) / sizeof(arr[0]);
    int target;

    printf("请输入一个整数: ");
    scanf_s("%d", &target);

    int result = binarySearch(arr, size, target);
    if (result != -1) {
        printf("该数是数组中的第 %d 个数\n", result);
    }
    else {
        printf("无此数\n");
    }

	system("pause");
	return 0;
}

10、统计文件字符种类 3行80列

#include<bits/stdc++.h>

int main() {

    FILE* file;
    char article[3][81]; // 每行最多80个字符,外加一个'\0'
    int uppercase = 0, lowercase = 0, digits = 0, spaces = 0, others = 0;

    // 打开文件
    file = fopen("article.txt", "r");
    if (file == NULL) {
        printf("无法打开文件。\n");
        return 1;
    }

    // 读取文章
    for (int i = 0; i < 3; i++) {
        if (fgets(article[i], sizeof(article[i]), file) == NULL) {
            break;
        }
    }

    // 关闭文件
    fclose(file);

    // 遍历文章并统计各类字符
    for (int i = 0; i < 3; i++) {
        for (int j = 0; article[i][j] != '\0'; j++) {
            if (isupper(article[i][j])) {
                uppercase++;
            }
            else if (islower(article[i][j])) {
                lowercase++;
            }
            else if (isdigit(article[i][j])) {
                digits++;
            }
            else if (isspace(article[i][j])) {
                spaces++;
            }
            else {
                others++;
            }
        }
    }

    // 输出结果
    printf("大写字母: %d\n", uppercase);
    printf("小写字母: %d\n", lowercase);
    printf("数字: %d\n", digits);
    printf("空格: %d\n", spaces);
    printf("其他字符: %d\n", others);

	system("pause");
	return 0;
}

12、电文加密

加密方法:第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变,下载需要编写解密算法,将密文解密成原文,输出密码和原文

#include<bits/stdc++.h>

void encrypt(char* plaintext, char* ciphertext) {
    int i;
    for (i = 0; plaintext[i] != '\0'; i++) {
        if (isalpha(plaintext[i])) {
            if (isupper(plaintext[i])) {
                ciphertext[i] = 'Z' - (plaintext[i] - 'A');
            }
            else if (islower(plaintext[i])) {
                ciphertext[i] = 'z' - (plaintext[i] - 'a');
            }
        }
        else {
            ciphertext[i] = plaintext[i];
        }
    }
    ciphertext[i] = '\0'; // 确保字符串以空字符结尾
}

// 解密函数
void decrypt(char* ciphertext, char* plaintext) {
    int i;
    for (i = 0; ciphertext[i] != '\0'; i++) {
        if (isalpha(ciphertext[i])) {
            if (isupper(ciphertext[i])) {
                plaintext[i] = 'Z' - (ciphertext[i] - 'A');
            }
            else if (islower(ciphertext[i])) {
                plaintext[i] = 'z' - (ciphertext[i] - 'a');
            }
        }
        else {
            plaintext[i] = ciphertext[i];
        }
    }
    plaintext[i] = '\0'; // 确保字符串以空字符结尾
}

int main() {
    char plaintext[100];
    char ciphertext[100];
    char decryptedText[100];

    printf("请输入原文: ");
    fgets(plaintext, sizeof(plaintext), stdin);
    // 去掉换行符
    plaintext[strcspn(plaintext, "\n")] = '\0';

    encrypt(plaintext, ciphertext);
    printf("加密后的密文: %s\n", ciphertext);

    decrypt(ciphertext, decryptedText);
    printf("解密后的原文: %s\n", decryptedText);


	system("pause");
	return 0;
}

11、 13、 14、 15 都在下面 (课堂上写的)

#include<stdio.h>
#include<string.h>

void myStrCat(char* str1, char* str2) {		// 自定义字符串连接函数
	for (int i = 0, j = strlen(str1); i < strlen(str2); i++, j++) { str1[j] = str2[i]; }
}

void myStrCopy(char* str1, char* str2) {	// 自定义字符串复制函数
	for (int i = 0; i < strlen(str2) + 1; i++) { str1[i] = str2[i]; }
}

int myStrCmp(char* str1, char* str2) {		// 自定义字符串比较函数
	int strSum = 0;
	for (int i = 0; str1[i] != '\0 '&& str2[i] != '\0'; i++) {
		if (str1[i] != str2[i]) strSum += (str1[i] - str2[i]);
		else continue;
	}
	return strSum;
}

void findMaxStr() {		// 自定义寻找最大字符串函数
	char strs[3][10] = { "hello","world","imwxy" };
	char maxStr[20];
	myStrCopy(maxStr, strs[0]);
	for (int i = 0; i < 3; i++) {
		if (myStrCmp(maxStr, strs[i]) < 0) {
			myStrCopy(maxStr, strs[i]);
		}
	}
	puts(maxStr);
}

void myprint() {	// 打印符号作业
	char xx[] = "*****";
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < i; j++) {
			printf(" ");
		}
		printf("%s\n", xx);
	}
}

int main() {
	char str1[200] = "hellooooo";
	char str2[] = "world";
	//findMaxStr();
	myprint();
	system("pause");
	return 0;
}

找出二维数组额鞍点 (课堂上写的,上面是课后写的)

#include<stdio.h>
#include<stdlib.h>

/*
	2,6,8,7,5
	4,3,1,5,2	<--  例如次数组的 第二行第四列的5是该行最大值,该列最小值,满足鞍点定义
	4,8,9,6,1		 
	9,5,7,8,6
	5,9,2,9,7
*/

int main(){
	int arr[5][5] = {2,6,8,7,5, 4,3,1,5,2, 4,8,9,6,1, 9,5,7,8,6, 5,9,2,9,7};
	int m = 5,n = 5;
	int flag2 = 0;	// 判断全局是否有鞍点,默认没有,初始值为0
	for(int i = 0;i<5;i++){
		int flag1 = 1; // 只判断本行最大值是否为鞍点,每一行都有最大值,所以初始值为1
		int maxj = 0;
		for(int j = 0;j < 5;j++){
			int max = arr[i][maxj];
			if(arr[i][j] > max){
				max = arr[i][j];
				maxj = j;
			}
		}
		int k;	// k 为第maxj列的所有行
		for(k = 0;k < 5;k++){
			if(arr[k][maxj] < arr[i][maxj]){    // 此时列都是定值
				flag1 = 0;	// 本行最大值不是鞍点
			}
		}
		if(flag1){
			flag2 = 1;	// 本行最大值是鞍点,所以全局有鞍点
			printf("第%d行,第%d列的%d是鞍点\n",i+1,maxj+1,arr[i][maxj]);
		}
	}
	if(!flag2){
		printf("没有鞍点\n");
	}
	system("pause");
	return 0;
}