以下是我初学C语言的笔记记录,欢迎评论区留言补充
【共有三道题】
一,写一个函数,能够判断出100-200之间的素数
【判断方法】
只能被1或是它本身整除;
意味着比如素数7,只能被1或是它本身整除,或是讲,它不能被2-6整除
不用函数,有三种思路做法
(1)
cs//方法一(不是函数的方法) int main() { int i = 0; for (i = 100;i <= 200; i++) { int j = 0; int flag = 1;//1为素数,0不是素数 for (j = 2; j <= i - 1; j++) { if (i % j == 0) { flag = 0; break; } } if (1 == flag) printf("是素数%d ",i); } return 0; }
(2)
cs//方法2 (不是函数的方法) //思路:如果不是素数,比如16 = 2*8 = 4*4 = a*b //则必然a或是b有一个数<= sqrt(16) = 4 #include<math.h> int main() { int i = 0; for (i = 100; i <= 200; i++) { int j = 0; int flag = 1; for (j = 2; j <= sqrt(i); j++) { if (i % j == 0) { flag = 0; break; } } if (1 == flag) { printf("是素数%d ", i); } } return 0; }
(3)
cs//方法三(不是函数的方法) //思路:是素数的话,意味着奇数 int main() { int i = 0; for (i = 101;i <= 200; i+=2) { int j = 0; int flag = 1;//1为素数,0不是素数 for (j = 2; j <= i - 1; j++) { if (i % j == 0) { flag = 0; break; } } if (1 == flag) printf("是素数%d ",i); } return 0; }
用函数
cs//用函数 //如果是素数,返回1;不是返回0 int is_prime(int n) { int j = 0; for (j = 2; j <= n - 1; j++) { if (n % j == 0) return 0; } return 1; } int main() { int i = 0; int count = 0; for (i = 100; i <= 200; i++) { if (is_prime(i)) { count++; printf("素数为:%d\n", i); } } printf("\n总共:%d", count); return 0; }
当然,也可以进行优化,比如用上面(2)(3)的思路
二, 写一个函数判断是不是闰年,2000-2040年
【判断方法】
第一种:能被4整除,但是不能被100整除;
第二种:能被400整除
不用函数的方法,有两种思路
(1)
csint main() { int year = 0; int count = 0; for (year = 2000; year <= 2040; year++) { if (year % 4 == 0 && year % 100 != 0) { printf("是闰年%d\n", year); count++; } if (year % 400 == 0) { printf("是闰年%d\n", year); count++; } } printf("\ncount=%d", count); return 0; }
(2)
csint main() { int year = 0; int count = 0; for (year = 2000; year <= 2040; year++) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { printf("是闰年%d\n", year); count++; } } printf("总共:%d", count); return 0; }
用函数
csint is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return 1; else return 0; } int main() { int year = 0; int count = 0; for (year = 2000; year <= 2040; year++) { if (is_leap_year(year)) { printf("是闰年:%d\n", year); count++; } } printf("总共:%d", count); return 0; }
三, 写一个函数,实现一个整形有序数组的二分查找
【判断方法】左右下标,与左右整除出来的下标mid 的关系
不用函数
csint main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int sz = 0; int left = 0; int mid = 0; int right = 0; sz = sizeof(arr) / sizeof(arr[0]); right = sz - 1; while (left <= right) { mid = left + (right - left) / 2; //mid 需要放在while里面, //如果在外面,则while里对mid的修改不起效,那么就没有结果输出 if (arr[mid] > k) { right = mid - 1; } else if (arr[mid] < k) { left = mid + 1; } else { printf("找到了,下标为:%d", mid); break; } } if (left > right) { printf("找不到了"); } return 0; }
用函数
csint is_find(int arr[], int k, int sz) { //mid,left,right //k,sz int left = 0; int right = 0; right = sz - 1; while (left <= right) { int mid = 0; mid = left + (right - left) / 2; if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else return mid; } return -1; } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int sz = 0; sz = sizeof(arr) / sizeof(arr[0]); //查找k int a = 0; a = is_find(arr, k, sz); if (a == -1) printf("没找到"); else printf("找到,下标:%d", a); //这里在main函数中,要引用mid,是没法的 //可以将mid设为函数的返回值,并且在main函数中 //定义一个变量a来存储返回值 return 0; }
【注意】
*
main函数中没法直接引用自定义函数中的量,需要想办法,比如自定义函数返回值,且让main函数中有一个变量可以进行接收
*
sz不可以放在自定义函数中进行计算,原因:数组传参实际上传给形参的是数组第一个元素的地址,即形参此时的参数是一个指针变量,如果在这样的条件下,还进行sz大小的计算,那么结果可能是1或是2,即用指针变量的大小 / 一个整形数组的元素,由于指针变量大小可能是4或是8个字节,所以结果是1或是2
*
数组传参实际上是传递的是数组首个元素的地址,而不是整个数组,所以在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的
【琐碎记录】
- 布尔类型c99后,值为true,false,类型是bool,应用stdbool.h的头文件,大小一个字节
2 .for(;;)
-
return的作用大于break;break只是结束一个循环,而return就是已经出结论的程度,函数直接结束;
-
if,else if ,如果一个条件满足第一个if,则不会走else if,但是如果都是if , if那么就算符合第一个if也是要再走下一个if的条件;