目 录CONTENT

文章目录

C语言复习

不争
2024-01-02 / 0 评论 / 0 点赞 / 9 阅读 / 26734 字

C语言复习

1.输入九九乘法表(上三角)

#include <stdio.h>
int main() {

    //上三角
    for (int i = 1 ; i <= 9; i ++)
    {
        for (int j = 1 ; j <= 9 ; j ++) {
            if (i <= j) printf("%d*%d=%2d ", i,j,i*j);
            else printf("       "); //七个空格
        }
        printf("\n");
    }

    return 0;
}

运行结果:

2.输入九九乘法表(下三角)

#include <stdio.h>
int main() {

    //上三角
    for (int i = 1 ; i <= 9; i ++)
    {
        for (int j = 1 ; j <= 9 ; j ++) {
            //下三角按照我们乘法表习惯,小的在前 i,j还需调换一下
            if (j <= i) printf("%d*%d=%2d ", j,i,i*j);
            else printf("       ");
        }
        printf("\n");
    }

    return 0;
}

运行结果:

下三角乘法表

解析: i代表行, j代表列

上三角i <= j 随着行数的 +1,每一列 -1下三角 j <= i, 随着行数+1 打印的列数 + 1

解析乘法表

只是选择性打印区别,都是O(n*n);

3.双向冒泡排序(鸡尾酒排序)

#include <stdio.h>

void bubble_sort(int array[], int n) {
    int left = 0, right = n - 1;
    while (left < right) {
        //从左往右冒泡
        for (int i = left ; i < right ; i ++) {
            if (array[i] > array[i + 1]) {
                int tmp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = tmp;
            }
        }
        right --;

        //从右往左冒泡
        for (int i = right ; i > left ; i --) {
            if (array[i] < array[i - 1]) {
                int tmp = array[i];
                array[i] = array[i - 1];
                array[i - 1] = tmp;
            }
        }
        left ++;
    }
}

int main() {
    int array[] = {5, 2, 8, 3, 1, 6};
    int n = sizeof(array) / sizeof(array[0]);
    bubble_sort(array, n);
    //输出排序后的数组
    for (int i = 0 ; i < n ; i ++) {
        printf("%d ", array[i]);
    }

    return 0;
}

4.杨辉三角

#include <stdio.h>

int main() {
    int rows, coef = 1;

    printf("请输入行数: \n");
    scanf("%d", &rows);

    for(int i = 0; i < rows; i++) {
        for(int space = 1; space <= rows-i; space++) {
            printf("  ");
        }

        for(int j = 0; j <= i; j++) {
            if (j == 0 || i == 0)
                coef = 1;
            else
                coef = coef*(i-j+1)/j;

            printf("%4d", coef);
        }

        printf("\n");
    }

    return 0;
}

5.杨辉三角(递归)

#include <stdio.h>

int yanghui(int i, int j) {
    if (j == 1 || j == i) {
        return 1;
    }
    return yanghui(i-1, j-1) + yanghui(i-1, j);
}

int main() {
    int n, i, j;
    printf("请输入杨辉三角的行数:\n");
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        for (j = 0; j < n - i ; j ++) {
            printf("  ");
        }
        for (j = 1; j <= i; j++) {
            printf("%4d", yanghui(i, j));
        }
        printf("\n");
    }
    return 0;
}

6.最大公倍数和最小公倍数

#include <stdio.h>

int gcd(int a, int b) // 求最大公因数
{
    int temp;
    while (b != 0 ) {
        temp = a % b;
        a = b;
        b = temp;
    }
    return a;

}
int lcm(int a, int b) //求最小公倍数
{
    int gcdValue = gcd(a, b);
    return (a * b) / gcdValue;
}

int main() {
    int num1, num2;
    printf("Enter two numbers: \n");
    scanf("%d%d", &num1, &num2);
    printf("最大公因数: %d\n", gcd(num1, num2));
    printf("最小公倍数: %d", lcm(num1, num2));

}

7.最大公倍数和最小公倍数(递归)

#include <stdio.h>
int gcd(int a, int b) // 求最大公因数
{
    if (b == 0) return a;
    else return gcd(b, a%b);
}


int lcm(int a, int b) //求最小公倍数
{
    int gcdValue = gcd(a, b);
    return (a * b) / gcdValue;
}

int main() {
    int num1, num2;
    printf("Enter two numbers: \n");
    scanf("%d%d", &num1, &num2);
    printf("最大公因数: %d\n", gcd(num1, num2));
    printf("最小公倍数: %d", lcm(num1, num2));

}

8.优雅菱形

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main() {
    //输入行数n
    int n;
    scanf("%d", &n);

    int sx = n / 2, sy = n / 2;
    for (int i = 0 ; i < n ; i ++) {
        for (int j = 0 ; j < n ; j ++) {
            if (abs(sx - i) + abs(sy - j) <= n / 2) printf("*");
            else printf(" ");
        }
        printf("\n");
    }

    return 0;
}

优雅菱形

8.行列转换

#include <stdio.h>
#include <string.h>
int n, t;
int main(void)
{
    scanf("%d", &n);
    printf("%d的行列式为:\n", n);

    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < n; j++) { 
            printf("%d\t", ++t); 
        }
        printf("\n");
    }

    printf("转置为: \n"); 

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < n; j++) {
                printf("%d\t", i+n*j);
        }
        printf("\n");
    }
     return 0;
}

行列转换

9.行列转换(数组版本)

#include <stdio.h>
int n, t;
int main(void)
{
    scanf("%d", &n);
    int a[n][n];
    printf("%d的行列式为:\n", n);

    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < n; j++) { 
            a[i][j] = ++t;
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    printf("行列转换后:\n", n);
    for (int i = 0 ; i < n ; i ++) {
        for (int j = 0 ; j < n ; j ++) {
            printf("%d\t", a[j][i]);
        }
        printf("\n");
    }
}

10.汉诺塔

#include <stdio.h>

// 声明函数
void hanoi(int n, char A, char B, char C);

int main() {
    int n;
    printf("请输入汉诺塔的层数:");
    scanf("%d", &n);
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

// 实现函数
void hanoi(int n, char A, char B, char C) {
    // 当n为1时,直接将盘子从A柱移动到C柱
    if (n == 1) {
        printf("%c -> %c\n", A, C);
    } else {
        // 将上面的n-1个盘子从A柱借助C柱移动到B柱
        hanoi(n - 1, A, C, B);
        // 将最底下的一个盘子从A柱移动到C柱
        printf("%c -> %c\n", A, C);
        // 将剩下的n-1个盘子从B柱借助A柱移动到C柱
        hanoi(n - 1, B, A, C);
    }
}

11.素数筛选法

#include <stdio.h>
#include <stdbool.h>

int main() {
    int n = 100;
    bool p[n+1];

    // 初始化数组元素全部为true,即假设所有数都是素数
    memset(p, true, sizeof(p));

    // 从2开始筛选素数,直到p^2大于n
    for (int i = 2; i * i <= n; i++) {
        // 如果p是素数,将p的所有倍数标记为非素数
        if (p[i]) {
            // 从p^2开始标记,因为小于p^2的倍数已经被标记过了
            for (int j = 2; i * j <= n; j ++) {
                p[i * j] = false;
            }
        }
    }

    // 打印所有素数
    for (int i = 2; i <= n; i++) {
        if (p[i]) {
            printf("%d ", i);
        }
    }
    return 0;
}

12.素数枚举

#include <stdio.h>
#include <stdbool.h>

bool p(int x) {
    for (int i = 2 ; i <= x / i ; i ++) {
        if (x % i == 0) {
            return false;
        }
    }
    return true;
}

int main() 
{
    int n = 100;
    for (int i = 2 ; i <= n ; i ++) {
        if (p(i)) printf("%d ", i);
    }

}

13.统计字符串*的个数

#include <stdio.h>
#include <string.h>
void fun(char *s, int *t);
int main() {
    int t = 0;
    char s[] = "abc*def**adgh*kjsdf*";
    fun(s, &t);
    printf("%d\n", t);

    return 0;
}
void fun(char *s, int *t) {
    for (int i = 0 ; i < strlen(s); i ++) {
        if (s[i] == '*') (*t)++ ;
    }
}

14.功能是实现两个字符串连接。

#include <stdio.h>
//手写strcat
char *strcat(char *dest, const char *src) {
    char *p = dest;
    while(*dest) dest++;
    while(*dest++ = *src++);
    return p;
}
int main() {
    char a[] = "abc", b[] = "dahjdjkas";
    strcat(a,b);
    printf("%s", a);
    return 0;
}
0

评论区