当前位置:   article > 正文

函数练习1——素数判断、闰年判断、二分查找等

函数练习1——素数判断、闰年判断、二分查找等

1.写一个函数判断是否是素数

逻辑一:拿2~i-1之间的数字去除1

  1. //打印100-200之间的素数
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int count = 0;
  6. int i = 0;
  7. for (i = 100; i <= 200; i++)
  8. {
  9. int flag = 1;//flag是1表示是素数
  10. int j = 0;
  11. for (j = 2; j < i; j++)
  12. {
  13. if (i % j == 0)
  14. {
  15. flag = 0;
  16. break;
  17. }
  18. }
  19. if (flag == 1)
  20. {
  21. count++;
  22. printf("%d ", i);
  23. }
  24. }
  25. printf("\ncount = %d", count);
  26. return 0;
  27. }

逻辑二:拿2~sqrt(i)之间的数字去除1

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int count = 0;
  6. int i = 0;
  7. for (i = 100; i <= 200; i++)
  8. {
  9. int flag = 1;//flag是1表示是素数
  10. int j = 0;
  11. for (j = 2; j <= sqrt(i); j++)
  12. {
  13. if (i % j == 0)
  14. {
  15. flag = 0;
  16. break;
  17. }
  18. }
  19. if (flag == 1)
  20. {
  21. count++;
  22. printf("%d ", i);
  23. }
  24. }
  25. printf("\ncount = %d", count);
  26. return 0;
  27. }

逻辑三:逻辑二的基础上只生成奇数

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int count = 0;
  6. int i = 0;
  7. for (i = 101; i <= 200; i+=2)
  8. {
  9. int flag = 1;//flag是1表示是素数
  10. int j = 0;
  11. for (j = 2; j <= sqrt(i); j++)
  12. {
  13. if (i % j == 0)
  14. {
  15. flag = 0;
  16. break;
  17. }
  18. }
  19. if (flag == 1)
  20. {
  21. count++;
  22. printf("%d ", i);
  23. }
  24. }
  25. printf("\ncount = %d", count);
  26. return 0;
  27. }

逻辑四:is_prime函数版本

  1. #include <stdio.h>
  2. #include <math.h>
  3. int is_prime(int n)
  4. {
  5. int j = 0;
  6. for (j = 2; j <= sqrt(n); j++)
  7. {
  8. if (n % j == 0)
  9. {
  10. return 0;
  11. }
  12. }
  13. return 1;
  14. }
  15. int main()
  16. {
  17. int count = 0;
  18. int i = 0;
  19. for (i = 101; i <= 200; i+=2)
  20. {
  21. if (is_prime(i))
  22. {
  23. printf("%d ", i);
  24. count++;
  25. }
  26. }
  27. printf("\ncount = %d", count);
  28. return 0;
  29. }

2.写一个函数判断是否是闰年

闰年判断的规则:1.能被4整除且不能被100整除

                             2.能被400整除

逻辑一:分两种情况判断非函数版本

  1. #include <stdio.h>
  2. //打印1000-2000之间的所有的闰年
  3. int main()
  4. {
  5. int year = 0;
  6. for (year = 1000; year <= 2000; year++)
  7. {
  8. if (year % 4 == 0)
  9. {
  10. if (year % 100 != 0)
  11. {
  12. printf("%d ", year);
  13. }
  14. }
  15. if (year % 400 == 0)
  16. printf("%d ", year);
  17. }
  18. return 0;
  19. }

逻辑二:一个判断表达式非函数版本

  1. #include <stdio.h>
  2. //打印1000-2000之间的所有的闰年
  3. int main()
  4. {
  5. int year = 0;
  6. for (year = 1000; year <= 2000; year++)
  7. {
  8. if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
  9. {
  10. printf("%d ", year);
  11. }
  12. }
  13. return 0;
  14. }

逻辑三:is_leap_year函数版本

  1. #include <stdio.h>
  2. int is_leap_year(int n)
  3. {
  4. if (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0))
  5. return 1;
  6. return 0;
  7. }
  8. int main()
  9. {
  10. int year = 0;
  11. for (year = 1000; year <= 2000; year++)
  12. {
  13. if (is_leap_year(year))
  14. printf("%d ", year);
  15. }
  16. return 0;
  17. }

3.写一个函数,实现整形有序数组的二分查找

  1. #include <stdio.h>
  2. int binary_search(int arr[], int k, int sz)
  3. {
  4. int left = 0;
  5. int right = sz - 1;
  6. while (left <= right)
  7. {
  8. int mid = left + (right - left) / 2;
  9. if (arr[mid] == k)
  10. {
  11. return mid;
  12. }
  13. else if (arr[mid] > k)
  14. {
  15. right = mid - 1;
  16. }
  17. else
  18. {
  19. left = mid + 1;
  20. }
  21. }
  22. return -1;
  23. }
  24. int main()
  25. {
  26. int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  27. int k = 7;
  28. int sz = sizeof(arr) / sizeof(arr[0]);
  29. //找到了,返回下标
  30. //找不到,返回-1
  31. int ret = binary_search(arr, k, sz);
  32. if (ret == -1)
  33. {
  34. printf("找不到\n");
  35. }
  36. else
  37. {
  38. printf("找到了,下标是:%d", ret);
  39. }
  40. return 0;
  41. }

坑点:1.找不到,返回的不能是0(因为数组下标也可能是0),应该返回-1

           2.不能在数组内部计算sz,因为传参传的数组名实际上是数组首元素的地址,不知道数组一共多少个元素

4.写一个函数,每调用一次,num加1

逻辑一:传址调用

  1. #include <stdio.h>
  2. void Add(int* p)
  3. {
  4. (*p)++;
  5. }
  6. int main()
  7. {
  8. int num = 1;
  9. printf("%d ", num);//1
  10. Add(&num);
  11. printf("%d ", num);//2
  12. Add(&num);
  13. printf("%d ", num);//3
  14. return 0;
  15. }

逻辑二:传值调用

  1. int Add(int n)
  2. {
  3. return n + 1;
  4. }
  5. int main()
  6. {
  7. int num = 1;
  8. printf("%d ", num);//1
  9. num = Add(num);
  10. printf("%d ", num);//2
  11. num = Add(num);
  12. printf("%d ", num);//3
  13. return 0;
  14. }

坑点:尽量不要使用全局变量,不安全 

5.经典链式访问

  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("%d", printf("%d", printf("%d", 43)));
  5. return 0;
  6. }

结果:4321

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

闽ICP备14008679号