• 倒置字符串、猜名次、猜凶手、杨辉三角


    目录

     

    例一:倒置字符串

    例二:猜名次

    例三:猜凶手

    例四:杨辉三角

    方法一 

    方法二 


     

    例一:倒置字符串

    首先我们先来看一下题目具体要求

    e76929e555c24a50b77a88fe65ba2571.png

    再来看一下我们所需要的效果

    318c38a0065f4ce2b5cc46f27067ace0.png

     这里呢,博主给出两种思路,一种是先将整个字符串逆序,再将单个单词逆序;另一种是先将单个单词厉旭,再将整个字符串逆序

    1. 第一种
    2. I like beijing.
    3. .gnijieb ekil I
    4. beijing. like i
    5. 第二种
    6. I ekil .gnijieb
    7. beijing. like I

     这里博主采用的是将整个字符串逆序,再将单个单词逆序(采用的是指针,若有宝子不懂得,可以看看博主以前得文章)因为需要逆序整个字符串和每个单词,所以博主在这儿将逆序这个功能单独拿出来,实现函数如下

    1. void jiaohuan(char* p1, char* p2)
    2. {
    3. while (p1 < p2)//退出循环的条件
    4. {
    5. char tmp = *p1;
    6. *p1 = *p2;
    7. *p2 = tmp;
    8. p1++;
    9. p2--;
    10. }
    11. }

    我们有了这个函数后,后面需要逆序时我们就只需要调用就好了

    当我们逆序了整个字符串后,逆序每个单词成了我们的难点,首先我们得知道,单词与单词用什么来判断,如何判断结束:单词与单词间我们用空格,结束我们们用‘\0'来判断

    这里博主引入两个指针

    1. char* start = arr;
    2. char* cur = arr;

     start不用动,cur遍历整个数组,原理如下

    c83fe7b567a54d78a79187e6e142a7d5.png

    其实到这儿我们基本多思考一下就大概可以想到解题代码了,如果没有思路,就浅看一下博主写的吧

    1. while (*cur)
    2. {
    3. while (*cur != ' '&&*cur!='\0')//判断跳出循环的条件
    4. {
    5. cur++;
    6. }
    7. jiaohuan(start, cur - 1);//逆序每一单词
    8. start = cur + 1;//cur当前指的为空格,所一下一单词得开头需要加一
    9. if (*cur == ' ')//当有空格时,由于cur此时指得是空格,所以遍历时需要向后进一位
    10. cur++; //若没有空格,说明字符串已经遍历完成,不可再加一,否则会造成越界
    11. }

    图解如下

    426da65c036c4d16a1782867874fbb86.png

    主要功能已完成,我们便可以写出完整代码了,代码如下

    1. #include <stdio.h>
    2. void jiaohuan(char* p1, char* p2)
    3. {
    4. while (p1 < p2)
    5. {
    6. char tmp = *p1;
    7. *p1 = *p2;
    8. *p2 = tmp;
    9. p1++;
    10. p2--;
    11. }
    12. }
    13. int main()
    14. {
    15. char arr[101];
    16. gets(arr);
    17. int len = strlen(arr);
    18. jiaohuan(arr,arr+len-1);
    19. char* start = arr;
    20. char* cur = arr;
    21. while (*cur)
    22. {
    23. while (*cur != ' '&&*cur!='\0')//判断跳出循环的条件
    24. {
    25. cur++;
    26. }
    27. jiaohuan(start, cur - 1);
    28. start = cur + 1;
    29. if (*cur == ' ')
    30. cur++;
    31. }
    32. printf("%s", arr);
    33. return 0;
    34. }

    例二:猜名次

    题目具体要求如下

    b7da74a67f774ff5be660c1287d984bd.png

    考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性,这个只需要一个5层循环即可搞定。

    4749b071d7cd497c8a905bad1d53a66a.png

    其实这道题最难的是,如何判断选手那句话为真,其实我们把上述问题给简化一下

     f874b5176ac94bd1a7a350f6e5965be2.png

     我们呢所需要做的只是,对每一位选手说的话只信一半,然后把最后得出名次进行汇总,符合我们的条件就输出

    我们发现每一位选手都说了自己与另一名选手的成绩 ,那么我们是否可以把我们循环得到的数字与选手所说的进行判断呢,代码如下

    1. int shuohuang(int m, int n,int x,int y)
    2. //m,n为循环得到选手名词,x,y为选手自己所说名次
    3. {
    4. if ((m == x && n != y) || (m != x && n == y))
    5. return 1;
    6. else return 0;
    7. }

     对每个选手判断后,如果返回值都为1,那么就是我们想要的名次了吗?

    这里注意,并不是,博主已经吃过亏了,希望各位宝子可以避免。因为由于循环的原因会导致一些不期望出现的结果出现,因为我并没有查重,所以会出现两个人抢名次的情况,也就是两个人或者更多的人名次相同的情况,例如两个第二,三个第三这样的,所以即使满足了条件,也要查看一下五个人的名次是否重复,这个交给一个函数来执行

    1. int panduan(int a, int b, int c, int d, int e)
    2. {
    3. if (shuohuang(a, b, 3, 2) && shuohuang(b, e, 2, 4) && shuohuang(c, d, 1, 2) && shuohuang(d, c, 3, 5) && shuohuang(e, a, 4, 1) && (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e))
    4. return 1;
    5. else return 0;
    6. }

    到这里我们就完成了一大半了,那么还有一个问题,当你遍历到正确答案,该怎么跳出循环呢,看看博主怎么做的吧

    1. for (a = 1; a <= 5; a++)
    2. {
    3. for (b = 1; b <= 5; b++)
    4. {
    5. for (c = 1; c <= 5; c++)
    6. {
    7. for (d = 1; d <= 5; d++)
    8. {
    9. for (e = 1; e <= 5; e++)
    10. {
    11. if (panduan(a, b, c, d, e))//判断成功跳出循环
    12. {
    13. ret = 1;
    14. break;//一个break只跳出一个循环
    15. }
    16. }
    17. if (ret == 1)
    18. break;
    19. }
    20. if (ret == 1)
    21. break;
    22. }
    23. if (ret == 1)
    24. break;
    25. }
    26. if (ret == 1)
    27. break;
    28. }

     由于一个break只跳出一个循环,所以这里博主用了多个break;

    完整代码如下

    1. int shuohuang(int m, int n,int x,int y)
    2. {
    3. if ((m == x && n != y) || (m != x && n == y))
    4. return 1;
    5. else return 0;
    6. }
    7. int panduan(int a, int b, int c, int d, int e)
    8. {
    9. if (shuohuang(a, b, 3, 2) && shuohuang(b, e, 2, 4) && shuohuang(c, d, 1, 2) && shuohuang(d, c, 3, 5) && shuohuang(e, a, 4, 1) && (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e))
    10. return 1;
    11. else return 0;
    12. }
    13. int main()
    14. {
    15. int a = 0;
    16. int b = 0;
    17. int c = 0;
    18. int d = 0;
    19. int e = 0;
    20. int ret = 0;
    21. for (a = 1; a <= 5; a++)
    22. {
    23. for (b = 1; b <= 5; b++)
    24. {
    25. for (c = 1; c <= 5; c++)
    26. {
    27. for (d = 1; d <= 5; d++)
    28. {
    29. for (e = 1; e <= 5; e++)
    30. {
    31. if (panduan(a, b, c, d, e))
    32. {
    33. ret = 1;
    34. break;
    35. }
    36. }
    37. if (ret == 1)
    38. break;
    39. }
    40. if (ret == 1)
    41. break;
    42. }
    43. if (ret == 1)
    44. break;
    45. }
    46. if (ret == 1)
    47. break;
    48. }
    49. printf("A:%d\nB;%d\nC;%d\nD;%d\nE;%d\n", a, b, c, d, e);
    50. return 0;
    51. }

    例三:猜凶手

    题目具体要求如下

    481ffb4e34604a85bbe6a1e948be6b1d.png

    本题代码简单,但是呢思维巧妙,相信各位宝子看完代码就可以理解了

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int killer = 0;
    5. //分别假设凶手是a,b,c,d,看谁是凶手时满足3个人说了真话,一个人说了假话
    6. for (killer = 'a'; killer <= 'd'; killer++)
    7. {
    8. if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
    9. printf("凶手是:%c", killer);
    10. }//只需要一个个遍历,满足这四个人中三个人的条件即可判断出来
    11. return 0;
    12. }

    例四:杨辉三角

    题目要求为

    ae08550c6253425d8bb0110e538372c8.png

    题目要求了解呢后,我们来了解一下什么叫杨辉三角吧

    杨辉三角(也称帕斯卡三角)相信很多人都不陌生,它是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和。

    杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623—-1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

    方法一 

    其实这道题主要是找到规律就好做了,一起来看看博主的代码吧

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int n = 0;
    5. int i = 0;
    6. int arr[1000] = { 0 };
    7. scanf("%d", &n);
    8. for (i = 1; i < n; i++)
    9. {
    10. arr[0] = 1;
    11. int j = i-1;
    12. int x = 0;
    13. for (; j >0; j--)
    14. {
    15. arr[j] = arr[j - 1] + arr[j];
    16. }
    17. for (x = 0; x <i; x++)
    18. {
    19. printf("%d ", arr[x]);
    20. }
    21. printf("\n");
    22. }
    23. return 0;
    24. }

     画图解释如下

    4a71d235a00c4efc9a317e8144afc3b1.png

    方法二 

     

    1. void yangHuiTriangle(int n)
    2. {
    3. int data[30][30] = { 1 }; //第一行直接填好,播下种子
    4. int i, j;
    5. for (i = 1; i < n; i++) //从第二行开始填
    6. {
    7. data[i][0] = 1; //每行的第一列都没有区别,直接给1,保证不会越界。
    8. for (j = 1; j <= i; j++) //从第二列开始填
    9. {
    10. data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; //递推方程
    11. }
    12. }
    13. for (i = 0; i < n; i++) //填完打印
    14. {
    15. for (j = 0; j <= i; j++)
    16. {
    17. printf("%d ", data[i][j]);
    18. }
    19. putchar('\n');
    20. }
    21. }

     

    以上是博主在学习中遇到的难题,在此分享做题经验,对于这些题目有其他见解的友友,欢迎评论去留言探讨。

     

     

  • 相关阅读:
    笔记(二)图的基本表示【斯坦福CS224W图机器学习】
    RuoYi-Cloud版本限制一个账户只能在一个地方登陆
    【ZYNQ】petalinux实现开机自启动
    碎片化学习Python的又一神作:termux
    在Web服务器(IIS)上安装SSL证书并绑定网站
    React报错之Unexpected default export of anonymous function
    yum安装报错Error: rpmdb open failed
    基于SSM的概念可视化程序设计学习系统毕业设计源码021009
    KUKA机器人后台控制程序(SPS)介绍
    ant提供对所有系统属性的访问
  • 原文地址:https://blog.csdn.net/m0_71731682/article/details/130902327