当前位置:   article > 正文

练习分析小结(3) (复盘)_str1 and str2 are not same

str1 and str2 are not same

只要你愿意 开始总比放弃好。 Roman.

愿我们都有自己的目标并正在为其不懈努力。

-----------------------------------------------------------------------

六、 0301

1. 2的n次方计算【2的n次方计算

不使用累计乘法的基础上,通过移位运算(<<)实现2的n次方的计算。
数据范围:0≤n≤31

*代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. //每一次将1左移都相当于乘以2
  5. int n = 0;
  6. scanf("%d",&n);
  7. printf("%d\n",(1<<n));
  8. return 0;
  9. }

 2.  公务员面试【公务员面试

描述

公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。

(注:本题有多组输入

输入描述:

每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。

输出描述:

每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行。

 *代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. //七个一组
  5. int score = 0;
  6. int count = 0;
  7. int max = 0;
  8. int min = 100;
  9. int sum = 0;
  10. while ((scanf("%d", &score)) != EOF)
  11. {
  12. count++;
  13. if (max < score)
  14. {
  15. max = score;
  16. }
  17. if (min > score)
  18. {
  19. min = score;
  20. }
  21. sum += score;
  22. if (7 == count)
  23. {
  24. sum -= (min + max);
  25. printf("%.2f\n", sum / 5.0);
  26. count = 0;
  27. min = 100;
  28. max = 0;
  29. sum = 0;
  30. }
  31. }
  32. return 0;
  33. }

 *注意:读取一组数据:通过计数以及置零等手段进行实现(详见代码)

 3. 获得月份天数【获得月份天数

KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。

输入描述:

多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。

输出描述:

针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

 *代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int year = 0;
  5. int month = 0;
  6. int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  7. while (scanf("%d %d", &year, &month) == 2)
  8. {
  9. //要让二月份在每一次输入时均初始化为28
  10. days[1] = 28;
  11. //判断闰年
  12. if (((0 == year % 4) && (year % 100 != 0)) || (0 == year % 400))
  13. {
  14. days[1] = 29;
  15. }
  16. printf("%d\n", days[month - 1]);
  17. }
  18. return 0;
  19. }

 *分析:

  •  多组输入: !=EOF     or  == n(个数)    ~
  •  判断是否为闰年
  •  创建一个数组:存有每个月天数(闰年和非闰年二月份会进行单独处理) 

 4.  判断字母【判断字母

从键盘任意输入一个字符,编程判断是否是字母(包括大小写)。

输入描述:

输入包括一个字符。

输出描述:

输出该字符是字母(YES)或不是(NO)。

 *代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int ch = 0;
  5. ch = getchar();
  6. //判断
  7. if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
  8. {
  9. printf("YES\n");
  10. }
  11. else
  12. {
  13. printf("NO\n");
  14. }
  15. return 0;
  16. }

 *分析:

  •  用getchar()输入,按int类型接收

  *补充:(多组输入--注意getchar()使用

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int ch = 0;
  5. while ( (ch = getchar()) != EOF)
  6. {
  7. //判断
  8. if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')))
  9. {
  10. printf("YES\n");
  11. }
  12. else
  13. {
  14. printf("NO\n");
  15. }
  16. getchar(); //去掉缓存区中的换行键
  17. }
  18. return 0;
  19. }

 5.  变种水仙花

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

求出 5位数中的所有 Lily Number,每两个数间用空格隔开。

 *代码:

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int i = 0;
  6. for (i = 10000; i <= 99999; i++)
  7. {
  8. //判断i是否为lily number
  9. //每一次循环都要重新归零
  10. int sum = 0;
  11. int j = 0;
  12. //12345
  13. for (j = 1; j <= 4; j++)
  14. {
  15. int m = i % (int)pow(10, j);
  16. int n = i / (int)pow(10, j);
  17. sum += m * n;
  18. }
  19. 或者用常规方法:
  20. //for (int j = 10000; j >= 10; j /= 10)
  21. //{
  22. // int n1 = i / j;
  23. // int n2 = i % j;
  24. // sum += (n1 * n2);
  25. //}
  26. if (sum == i)
  27. {
  28. printf("%d ", i);
  29. }
  30. }
  31. return 0;
  32. }

七、 0303

 1. 下面关于"指针"的描述不正确的是:( )

A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL

B.32位系统下任何类型指针的长度都是4个字节

C.指针的数据类型声明的是指针实际指向内容的数据类型

D.野指针是指向未分配或者已经释放的内存地址

 *结果:A

 *分析: 

  • free  --释放指针内容,free不会更改指针的指向;指针变为野指针
  • 补充:动态内存管理(malloc申请空间    free释放/回收空间    calloc  realloc)

 2. 下面代码的执行结果是( )

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str1[] = "hello bit.";
  5. char str2[] = "hello bit.";
  6. char *str3 = "hello bit.";
  7. char *str4 = "hello bit.";
  8. if(str1 == str2)
  9. printf("str1 and str2 are same\n");
  10. else
  11. printf("str1 and str2 are not same\n");
  12. if(str3 == str4)
  13. printf("str3 and str4 are same\n");
  14. else
  15. printf("str3 and str4 are not same\n");
  16. return 0;
  17. }

 *答案:

str1 and str2 are not samestr3 and str4 are same

 *分析:

  • 相同字符串:若以数组创建则不同地址,若以常量字符串初始化则相同地址。
  • == 比较的是字符串的地址
  • str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4

 3. 字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

 *分析:

方法一:循环k次 + 完全左移 (循环k次进行优化, k%len次)

注:strlen()可以在传参函数里求字符串长度

       sizeof()不可以在传参函数里求大小

方法二:两部分分别逆序 再进行整体逆序 (逆序函数:while循环)

 *代码: 

  1. #include<stdio.h>
  2. // 方法一:循环k次+完全左旋(放到最后)
  3. char* Span1(char* p, int k)
  4. {
  5. int i = 0;
  6. int len = strlen(p);
  7. for (i = 0; i < k % len; i++)
  8. {
  9. char tmp = *p;
  10. //每次旋转都要进行整个数组内容的位置变换
  11. int j = 0;
  12. for (j = 0; j < (len - 1); j++)
  13. {
  14. /*char ret = *(p + j);
  15. *(p + j) = *(p + j + 1);
  16. *(p + j + 1) = ret;*/
  17. *(p + j) = *(p + j + 1);
  18. }
  19. *(p + len - 1) = tmp;
  20. }
  21. return p;
  22. }
  23. //逆序字符串
  24. void Move(char* pp, int start, int end)
  25. {
  26. while (start < end)
  27. {
  28. char* tmp = *(pp + start);
  29. *(pp + start) = *(pp + end-1);
  30. *(pp + end-1) = tmp;
  31. start++;
  32. end--;
  33. }
  34. return pp;
  35. }
  36. // 左逆分别 + 整体
  37. char* Span2(char* p, int k)
  38. {
  39. //函数内调用strlen求字符串长度
  40. int len = strlen(p);
  41. Move(p, 0, k % len);
  42. Move(p, k % len, len);
  43. Move(p, 0, len);
  44. return p;
  45. }
  46. int main()
  47. {
  48. int k = 0;
  49. char ch1[] = "ABCDEFG";
  50. printf("请输入循环次数k:");
  51. scanf("%d", &k);
  52. //方法一:
  53. char* tmp1 = Span1(ch1, k);
  54. printf("方法一:循环%d次+完全左旋:\n",k);
  55. printf("%s\n", tmp1);
  56. //方法二:
  57. char ch2[] = "ABCDEFG";
  58. char* tmp2 = Span2(ch2, k);
  59. printf("方法二:利用逆序字符串:\n");
  60. printf("%s\n", tmp2);
  61. return 0;
  62. }

 *结果:

 4.  杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(N);

  *代码:

  1. #include<stdio.h>
  2. void FindNum(int (*p)[5], int n, int* row, int* col)
  3. {
  4. int x = 0;
  5. int y = *col - 1;
  6. //找到一行中最大且一列中最小 or 一行中最小且一列中最大
  7. int flag = 0;
  8. //注意循环条件
  9. while (x < *row && y >= 0)
  10. {
  11. if (*(*(p + x) + y) < n)
  12. {
  13. x++;
  14. }
  15. else if (*(*(p + x) + y) > n)
  16. {
  17. y--;
  18. }
  19. else
  20. {
  21. *row = x;
  22. *col = y;
  23. return;
  24. }
  25. }
  26. //找不到
  27. *row = -1;
  28. *col = -1;
  29. }
  30. int main()
  31. {
  32. int Tran[3][5] = { 1,3,5,7,9,2,4,6,8,10,3,6,9,12,15 };
  33. int n = 0;
  34. int row = 3;
  35. int col = 5;
  36. printf("请输入您想查找的数n:");
  37. scanf("%d", &n);
  38. //注意:因为要修改保存row与col,所以传入地址
  39. FindNum(Tran, n, &row, &col);
  40. if ((-1 == row) && (-1 == col))
  41. {
  42. printf("找不到%d\n", n);
  43. }
  44. else
  45. {
  46. printf("找到了 下标为:x=%d y=%d\n", row, col);
  47. }
  48. return 0;
  49. }

 *结果:

------------------------一个人所有的愤怒都来源于对自己无能的痛苦。------------------------

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/800687
推荐阅读
相关标签
  

闽ICP备14008679号