• 临近期末,这些题不来看看吗?(下)


    目录

    1、打印1~100之间所有3的倍数(三种方法)

    2、写出3给整数从大到小输出

    3、给定两个数,求这两个数的最大公约数

    4、 递归实现n的k次方

    5、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

    6、编写一个函数 reverse_string(char * string)(非递归实现)

    7、编写一个函数 reverse_string(char * string)(递归实现)


    1、打印1~100之间所有3的倍数(三种方法)

    法一:

    让所有3的倍数与3求余都为0

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

    法二:

    让调整部分每次循环+3

    1. int main()
    2. {
    3. int i = 0;
    4. for (i = 3; i <= 100; i += 3)
    5. {
    6. printf("%d ", i);
    7. }
    8. return 0;
    9. }

    法三:

    让条件判断部分每次*3

    1. int main()
    2. {
    3. int i = 0;
    4. for (i = 1; i * 3 <= 100; i++)
    5. {
    6. printf("%d ", i * 3);
    7. }
    8. return 0;
    9. }

    2、写出3给整数从大到小输出

    1. #include
    2. int main()
    3. {
    4. int a = 0;
    5. int b = 0;
    6. int c = 0;
    7. //输入
    8. scanf("%d %d %d", &a, &b, &c);
    9. //排序
    10. //最大放在a中,最小放在c中,剩余放在a中就行
    11. if (a < b)
    12. {
    13. int tmp = a;
    14. a = b;
    15. b = tmp;
    16. }
    17. if (a < c)
    18. {
    19. int tmp = c;
    20. c = a;
    21. a = tmp;
    22. }
    23. if (b < c)
    24. {
    25. int tmp = b;
    26. b = c;
    27. c = tmp;
    28. }
    29. //打印
    30. printf("%d %d %d", a, b, c);
    31. return 0;
    32. }

    3、给定两个数,求这两个数的最大公约数

    法一:

    解题思路:

    首先最大公约数肯定不会超过两个数的最大值,所以先在a和b间找出最小值,再利用最小值分别对a、b求余,若两者余数都为0,说明就得到了最大公约数。

    1. int main()
    2. {
    3. int a = 0;
    4. int b = 0;
    5. //给定两个数
    6. scanf("%d %d", &a, &b);
    7. int k = (a > b ? b : a);//求a和b中最小值
    8. //a b
    9. while (1) //只要k不为0继续判断 //18 24
    10. { //18 18
    11. if (a % k == 0 && b % k == 0) //17 17
    12. { //6 6
    13. break; //a、b只要分别和k求余为0,就得到最大公约数
    14. }
    15. k--;
    16. }
    17. printf("%d ", k);
    18. return 0;
    19. }

    法二:

    辗转相除法:

    想了解辗转相除法可以看看这个链接:https://zhuanlan.zhihu.com/p/171623230

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

    4、 递归实现n的k次方

    解题思路:

    代码实现:

    1. #include
    2. double Pow(int n, int k)
    3. {
    4. if (k == 0)
    5. {
    6. return 1.0;
    7. }
    8. else if (k > 0)
    9. {
    10. return n * Pow(n, k - 1);
    11. }
    12. else //k<0
    13. {
    14. return 1.0 / Pow(n, -k);
    15. }
    16. }
    17. int main()
    18. {
    19. int n = 0;
    20. int k = 0;
    21. //输入
    22. scanf("%d %d", &n, &k);
    23. double ret = Pow(n, k);
    24. printf("%Lf\n", ret);
    25. return 0;
    26. }

    递归流程(画图)

    递:递推(黑线)

    归:回归(红线)

    假设要计算2的3次方

    5、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

    例如:调用DigitSum(1729),则应该返回19

    解题思路:

    当n是一位数时,返回组成它的数字之和不就是n本身

    当n是一位数以上时,可以想想是不是个位的数字非常好得到,只需让n%10即可,就举DigitSum(1729)可以传化成DigitSum(1729/10)+1729%10,接下来DigitSum(172/10)+172%10,这样以此类推下来不就是个递归吗

    这题类似于按顺序打印每一位

    https://blog.csdn.net/Weraphael/article/details/127831828

    代码实现:

    1. #include
    2. int DigitSum(int n)
    3. {
    4. if (n <= 9) //若输入一位数,则返回对应的值
    5. {
    6. return n;
    7. }
    8. else //n>9
    9. {
    10. return DigitSum(n / 10) + n % 10;
    11. }
    12. }
    13. int main()
    14. {
    15. int n = 0;
    16. //输入
    17. scanf("%d", &n);
    18. int ret = DigitSum(n);
    19. printf("%d\n", ret);
    20. return 0;
    21. }

    递归流程(画图)

    递:递推(黑线)

    归:回归(红线)

    6、编写一个函数 reverse_string(char * string)(非递归实现)

    实现:将参数字符串中的字符反向排列,不是逆序打印。
    要求:不能使用C函数库中的字符串操作函数。
    比如:char arr[]="abcdef"
    逆序后数组内容变成:fedcba

    解题思路:

    代码实现: 

    1. #include
    2. #include
    3. int Strlen(char* string)//计算字符串长度
    4. {
    5. int count = 0;
    6. while (*string != '\0')
    7. {
    8. count++;
    9. string++;
    10. }
    11. return count;
    12. }
    13. void reverse_string(char* string)
    14. {
    15. int left = 0;
    16. int right = Strlen(string) - 1;
    17. while (left <= right)
    18. {
    19. char tmp = string[left];
    20. string[left] = string[right];
    21. string[right] = tmp;
    22. left++;
    23. right--;
    24. }
    25. }
    26. int main()
    27. {
    28. char arr[] = "abcdef";
    29. reverse_string(arr);
    30. printf("%s\n", arr);
    31. return 0;
    32. }

    程序结果:

     最后再给大家推荐一种写法

    1. #include
    2. #include
    3. int Strlen(char* arr)//计算字符串长度
    4. {
    5. int count = 0;
    6. while (*arr != '\0')
    7. {
    8. count++;
    9. arr++;
    10. }
    11. return count;
    12. }
    13. void reverse_string(char* arr)
    14. {
    15. int left = 0;//左下标
    16. int right = Strlen(arr) - 1;//右下标
    17. while (left <= right)
    18. {
    19. char tmp = *(arr+left);
    20. *(arr + left) = *(arr+right);
    21. *(arr + right) = tmp;
    22. left++;
    23. right--;
    24. }
    25. }
    26. int main()
    27. {
    28. char arr[] = "abcdef";
    29. reverse_string(arr);
    30. printf("%s\n", arr);
    31. return 0;
    32. }

    中间部分代码解析:

    数组名是首元素的地址,对于形参的arr,其实就指向了a的地址,接着arr+left,而left一开始为0,加0等于没加还是指向a的地址, 最后再进行解引用,就找到了a。*(arr+right)也是如此。这种写法和一开始写的没差,主要是为了方便大家理解。

    7、编写一个函数 reverse_string(char * string)(递归实现)

    实现:将参数字符串中的字符反向排列,不是逆序打印。
    要求:不能使用C函数库中的字符串操作函数。
    比如:char arr[]="abcdef"

    解题思路:

    对于递归,可以拆成两步,第一步先交换a和f,第二步再调用reverse string(bcde),来逆序bcde。然后呢reverse string(bcde)又能拆成两步,第一步交换b和e。第二步再调用reverse string(cd),来逆序cd。接着reverse string(cd)又能拆成两步,第一步交换C和d,第二步调用reverse string(空字符串),调用空字符串时就能回归了,大概思路就是这样。

    代码实现: 

    1. #include
    2. int Strlen(char* string)//计算字符串长度
    3. {
    4. int count = 0;
    5. while (*string != '\0')
    6. {
    7. count++;
    8. string++;
    9. }
    10. return count;
    11. }
    12. void reverse_string(char* string)
    13. {
    14. int len = Strlen(string);//求字符串长度
    15. //交换
    16. char tmp = *string; //*string = a
    17. *string = *(string + len - 1); //*(string + len - 1) = f
    18. *(string + len - 1) = '\0'; //防止递归乱套
    19. if (Strlen(string + 1) >= 2) //防止死递归
    20. {
    21. reverse_string(string + 1);
    22. }
    23. *(string + len - 1) = tmp;
    24. }
    25. int main()
    26. {
    27. char arr[] = "abcdef";
    28. reverse_string(arr);
    29. printf("%s\n", arr);
    30. return 0;
    31. }

  • 相关阅读:
    【Nginx】基础概念和核心配置块
    java毕业设计云笔记管理系统Mybatis+系统+数据库+调试部署
    软件测试---
    【视频教程】基于PyTorch机器学习与深度学习实践应用与案例分析
    C++入门篇11 模板进阶
    【洛谷P1351】联合权值【数学】
    Python Opencv实践 - 图像的距(Moments,Hu Moments)
    CentOS7离线安装Docker和卸载Docker步骤(亲测有效)
    【Java 进阶篇】Java Filter 执行流程及生命周期详解
    uniapp存值和取值方法
  • 原文地址:https://blog.csdn.net/Weraphael/article/details/127939570