• C语言题目要求实现方法总结(1-10)


    目录

    一、互换A, B的值

    1. 1使用中间变量

    1.2 使用异或^(不允许创建中间变量)

    1.3 使用函数(指针传参)

    二、 按降序输出A, B的值

    2.1 直接实现

    2.2 使用指针

    三、 找出最大值

    3.1 遍历数组

    先输入再找(常规)

    边输入边找(改进)

    其实把数组优化掉也不是不可以(偷懒法,不够通用,第一个常规法最通用)

    四、进行排序

    4.1 暴力循环法

    4.2 冒泡排序

    五、逆序存储

    六、斐波那契数列

    递归实现(最简):

    函数实现

    七、公约数和公倍数:

    7.1 最大公约数

    函数实现

    递归实现(进阶)

    7.2 最小公倍数

    八、闰年

    九、switch语句

    十、求素数


    一、互换A, B的值

    1. 1使用中间变量

    1. int main() {
    2. int A, B;
    3. scanf("%d %d", &A, &B);
    4. int tmp = A;
    5. A = B;
    6. B = tmp;
    7. printf("%d %d", A, B);
    8. return 0;
    9. }

    1.2 使用异或^(不允许创建中间变量)

    1. int main()
    2. {
    3. int a,b;
    4. scanf("%d %d", &a, &b);
    5. a = a ^ b;
    6. b = a ^ b;
    7. a = a ^ b;
    8. printf("%d %d", a, b);
    9. retu

    1.3 使用函数(指针传参)

    1. int Swap(int* m, int* n)
    2. {
    3. int tmp;
    4. tmp = *n;
    5. *n = *m;
    6. *m = tmp;
    7. return 0;
    8. }
    9. int main()
    10. {
    11. int a, b;
    12. scanf("%d %d", &a, &b);
    13. Swap(a, b);
    14. printf("%d %d\n", a, b);
    15. return 0;
    16. }

    二、 按降序输出A, B的值

    2.1 直接实现

    1. int main() {
    2. int A, B;
    3. scanf("%d %d", &A, &B);
    4. if (A > B)
    5. printf("%d %d", A, B);
    6. if (A < B)
    7. printf("%d %d", B, A);
    8. return 0;
    9. }

    2.2 使用指针

    1. int main() {
    2. int A, B,*p,*q;
    3. scanf("%d %d", &A, &B);
    4. p = &A;
    5. q = &B;
    6. if(*p>*q)
    7. printf("%d %d", *p, *q);
    8. if (*p < *q)
    9. printf("%d %d", *q, *p);
    10. return 0;
    11. }

    三、 找出最大值

    背景:依次输入10个数,找出其中最大的数

    3.1 遍历数组

    先输入再找(常规)

    1. int main() {
    2. int a[10] = { 0 };
    3. for (int i = 0; i < 10; i++)//遍历数组输入10个数
    4. {
    5. scanf("%d", &a[i]);
    6. }
    7. int max = 0; //遍历数组找出最大值
    8. for (int i = 0; i < 10; i++)
    9. {
    10. if (max < a[i])
    11. max = a[i];
    12. }
    13. printf("%d", max);
    14. return 0;
    15. }

    边输入边找(改进)

    1. int main() {
    2. int a[10] = { 0 }, max = 0;;
    3. for (int i = 0; i < 10; i++)
    4. {
    5. scanf("%d", &a[i]);
    6. if (max < a[i])
    7. max = a[i];
    8. }
    9. printf("%d", max);
    10. return 0;
    11. }

    其实把数组优化掉也不是不可以(偷懒法,不够通用,第一个常规法最通用)

    1. int main() {
    2. int n,max = 0;;
    3. for (int i = 0; i < 10; i++)
    4. {
    5. scanf("%d", &n);
    6. if (max < n)
    7. max = n;
    8. }
    9. printf("%d", max);
    10. return 0;
    11. }

    四、进行排序

    背景:依次输入10个数,按降序输出

    因为需要存储这10个数,所以这次一定要用数组了(不然创建10个变量不够优雅)

    4.1 暴力循环法

    不使用排序方法排序数组,强行按降序输出,(循环较为繁琐)

    1. int main() {
    2. int a[10] = { 0 };
    3. int max = 0;
    4. for (int i = 0; i < 10; i++)
    5. {
    6. scanf("%d", &a[i]); //接收10个数
    7. if (max < a[i])
    8. max = a[i]; //得到最大值,方便后续循环建立
    9. }
    10. for (int j = max; j >= 0; j--)//从最大值开始向下遍历
    11. {
    12. for (int i = 0; i < 10; i++)//与数组内的数一一比较
    13. {
    14. if (j == a[i]) //相等则输出
    15. {
    16. printf("%d ", j);
    17. break; //输出后记得跳出循环,不然可能重复输出
    18. }
    19. }
    20. }
    21. return 0;
    22. }

    4.2 冒泡排序

            冒泡排序是一种简单直观的排序算法,它重复地走访要排序的元素,依次比较相邻的两个元素,如果它们的顺序不正确就交换它们。通过多次遍历数组并比较相邻元素的大小,最大(或最小)的元素会逐渐 “浮” 到最后(或最前)的位置,最终实现整个数组的排序。

    具体步骤如下:

    1. 从第一个元素开始,依次比较相邻的两个元素,如果顺序不正确就交换它们;
    2. 继续比较下一对相邻元素,执行同样的操作;
    3. 重复以上步骤,直到没有任何一对相邻元素需要交换位置。

            冒泡排序的时间复杂度为O(n^2),其中n表示待排序元素的个数。虽然冒泡排序效率较低,但由于实现简单,适用于元素数量较少的情况。

    1. //冒泡排序
    2. void sort(int a[10]) {
    3. for (int i = 0; i < 10; i++) { //遍历数组10次,每次移动一项
    4. for (int j = 0; j < 9; j++) //移动一项,每次移动一位,最多共需移动9次
    5. if (a[i] < a[i + 1]) //满足条件则交换两项
    6. {
    7. int tmp = a[i];
    8. a[i + 1] = a[i];
    9. a[i + 1] = tmp;
    10. }
    11. }
    12. }
    13. int main() {
    14. int a[10];
    15. for (int i = 0; i < 10; i++) //通过循环接收数组
    16. scanf("%d", &a[i]);
    17. sort(a); //调用函数进行冒泡排序
    18. for (int i = 0; i < 10; i++)
    19. printf("%d\n", a[i]); //打印结果
    20. return 0;
    21. }

    五、逆序存储

    背景:用数组接收10个整数,逆序存储,然后输出

    1. int main() {
    2. int a[10];
    3. for (int i = 0; i < 10; i++) //接收数组
    4. scanf("%d", &a[i]);
    5. for (int i = 0; i < 5; i++) //逆序存储
    6. {
    7. int tmp = a[i]; //对称交换5次,通过下标确定交换对象
    8. a[i] = a[9 - i];
    9. a[9 - i] = tmp;
    10. }
    11. for (int i = 0; i < 10; i++) //输出结果
    12. printf("%d", a[i]);
    13. return 0;
    14. }

    六、斐波那契数列

    递归实现(最简):

    递归

    1. int fib(int n) {
    2. if (n < 3)
    3. return 1;
    4. else
    5. return fib(n - 1) + fib(n - 2);
    6. }

    三目表达式

    1. int fib(int n) {
    2. return n < 3 ? 1 : fib(n - 1) + fib(n - 2);
    3. }

    函数实现

    1. //斐波那契数列循环实现
    2. int main() {
    3. int f1 = 1, f2 = 1, f3, ;
    4. printf("%d\n%d\n", f1,f2);
    5. for (int i = 1; i <= 30; i++)
    6. {
    7. f3 = f1 + f2;
    8. printf("%d\n", f3);
    9. f1 = f2;
    10. f2 = f3;
    11. }
    12. return 0;
    13. }

    举例是输出1-30项,稍加修改也可以得到某一项

    1. //斐波那契数列循环实现
    2. int main() {
    3. int f1 = 1, f2 = 1, f3, n;
    4. scanf("%d", &n); //输入想要得到的项
    5. for (int i = 1; i <= n; i++)
    6. {
    7. f3 = f1 + f2;
    8. f1 = f2;
    9. f2 = f3;
    10. }
    11. printf("%d\n", f2);
    12. return 0;
    13. }

    七、公约数和公倍数:

    7.1 最大公约数

    函数实现

    1. int gcd(int a, int b){
    2. while (b)
    3. {
    4. int t = b;
    5. b = a % b;
    6. a = t;
    7. }
    8. return a;
    9. }

    递归实现(进阶)

            三目表达式(最简)

    1. int gcd(int a, int b) {
    2. return b > 0 ? gcd(b, a % b) : a;
    3. }

    7.2 最小公倍数

    1. 需调用最大公约数

    1. int lcm(int a, int b) {
    2. return a * b / gcd(a, b);
    3. }

    2. 输出最大公约数和最小公倍数的实例

    1. //输出最大公约数和最小公倍数的实例
    2. int gcd(int a, int b) {
    3. return b > 0 ? gcd(b, a % b) : a;
    4. }
    5. int lcm(int a, int b) {
    6. return a * b / gcd(a, b);
    7. }
    8. int main() {
    9. int m, n;
    10. scanf("%d %d", &m, &n);
    11. int a =gcd(m, n);
    12. int b = lcm(m, n);
    13. printf("gcd=%d,lcm=%d",a,b);
    14. return 0;
    15. }

    3. 求多个数的最小公倍数

    1. //从定义出发
    2. int main() {
    3. int a, b, c;
    4. scanf("%d %d %d", &a, &b, &c);
    5. for (int i = 1;; i++) {
    6. if (i % a == 0 && i % b == 0 && i % c == 0)
    7. {
    8. printf("%d", i);
    9. break;
    10. }
    11. }
    12. return 0;
    13. }

    八、闰年

    1. //输出1900-2000年中是闰年的年份
    2. int main() {
    3. for (int i = 1900; i <= 2000; i++)
    4. if (i % 4 == 0 && i % 100 != 0 || i % 100 == 0 && i % 400 == 0)
    5. printf("%d ", i);
    6. return 0;
    7. }

    九、switch语句

    若题目要求使用switch语句,也要牢记switch语句的用法

    1. switch(表达式)
    2. {
    3. case 常量1:语句1
    4. case 常量2:语句2
    5. default:语句n
    6. break;
    7. }
    1. int bonus(int n) {
    2. if (n > 1000) //写一个奖金函数,判断奖金属于哪一档
    3. return 1;
    4. else if (n > 800 && n < 1000)
    5. return 2;
    6. else if (n > 600 && n < 800)
    7. return 3;
    8. else
    9. return 4;
    10. }
    11. int main() {
    12. int n;
    13. scanf("%d", &n);
    14. switch (bonus(n)) //通过switch语句完成
    15. {
    16. case 1:
    17. printf("perfect");
    18. break; //使用Switch语句不要忘记加break;
    19. case 2:
    20. printf("well done");
    21. break;
    22. case 3:
    23. printf("good");
    24. break;
    25. case 4:
    26. printf("keep trying");
    27. break;
    28. }
    29. return 0;
    30. }

    十、求素数

    求100-200之间的素数

    1. #include
    2. #include
    3. int main()
    4. {
    5. int i;
    6. int count = 0;
    7. for (i = 101; i < 200; i += 2) // 因为偶数一定不是素数,这里缩小范围,在奇数中去找素数
    8. {
    9. int j; //定义一个变量j用来表示因子
    10. int flag = 1;//此时定义一个flag标记,表示假设i是素数
    11. for (j = 2; j <= sqrt(i); j++)
    12. //假设一个数m= a*b,那么这个数m它的因子a和b中一定至少有一个因子小于等于m的开平方数
    13. {
    14. if (i % j == 0)
    15. {
    16. flag = 0;
    17. break;
    18. }
    19. }
    20. //当上一个for循环任意一个数i都不能被j(2到i-1)整除,也即j==i时,跳出for循环
    21. if (flag == 1) //此时判断如果flag还是为1,则说明i是素数
    22. {
    23. count++;
    24. printf("%d ", i);//打印素数
    25. }
    26. }
    27. printf("\ncount = %d\n", count);//所有素数求出来之后,打印素数的个数
    28. return 0;
    29. }

  • 相关阅读:
    企业如何提供安全方面的投资回报率?
    智能化改造给企业带来的实际效果
    分布式事务使用GlobalTransactional注解insert 报错java.sql.SQLException: 调用中的无效参数,
    【JavaSE】JavaSE之方法的使用
    C++ atomic 和 memory ordering
    用css画一个半圆弧(以小程序为例)
    LVS -DR
    【电路笔记】-波特图(Bode Diagrams)
    Unity16 UI
    OSPF复习
  • 原文地址:https://blog.csdn.net/qq_42995393/article/details/139281603