1.题——判断素数
#include <math.h>
#include <stdio.h>
int is_prime(int a) {
int j=0;
for (j = 2; j <= sqrt(a); j++)
{
if (a % j == 0) {
return 0;
}
}
return 1;
}
int main()
{
//判断素数
int i = 0;
for (i = 101; i <= 200; i++)
{
if (is_prime(i)) {
printf("%d是素数", i);
}
}
return 0;
}
转为函数:
#include <math.h>
#include <stdio.h>
int is_prime(int a) {
int j=0;
for (j = 2; j <= sqrt(a); j++)
{
if (a % j == 0) {
return 0;
}
}
return 1;
}
int main()
{
//max
//int a = 0, b = 0;
//scanf("%d %d", &a, &b);
///*int m = get_max(a, b);
//printf("max:%d\n", m);*/
//printf("交换前:%d %d\n", a, b);
//swap(&a, &b);
//printf("交换后:%d %d", a, b);
//判断素数
int i = 0;
for (i = 101; i <= 200; i++)
{
if (is_prime(i)) {
printf("%d是素数", i);
}
}
return 0;
}
2.题——判断是否是闰年
函数功能要足够单一。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int is_leap_year(int y)
{
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
return 1;
}
return 0;
}
int main()
{
//判断是否是闰年
//闰年:year%4==0 && year%100!=0
// year%4!=0&&year%400==0
int year = 0;
for (year = 1000; year <= 2000; year++) {
if (is_leap_year(year))
{
printf("%d ", year);
}
}
return 0;
}
3.题——二分查找
sz不能在函数中定义是因为你此时传过去的不是数组而是数组的首地址,大小为8个字节,所以sz总是等于2.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int search(int arr[], int a, int asz)//arr表示传过来的arr数组的首元素地址
{
int left = 0;
int right = asz-1;
int mid = 0;
while (left <= right)
{
mid = left + (right - left) / 2;//防止mid溢出
if (arr[mid] == a) {
return mid;
}
else if(arr[mid]>a){
right = mid - 1;
}
else {
left = mid + 1;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,10,11 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int flag = search(arr, k, sz);
//找到了,返回下标
//找不到,返回-1
if (flag == -1) {
printf("找不到");
}
else {
printf("找到了,下标是%d", flag);
}
return 0;
}
4.递归——题——模拟strlen()
//使用临时变量
//int newstrlen(char* arr)
//{
// static int n = 0;
// while (*arr!= '\0') {
// n++;
// arr++;
// }
// return n;
//}
//不使用临时变量
int newstrlen(char* arr)
{
if (*arr != '\0')
return 1 + newstrlen(arr + 1);
else
return 0;
}
int main()
{
char arr[] = "helloworld!";
int sz = newstrlen(arr);
printf("%d\n", sz);
return 0;
}
5.递归——题——逆转字符串序列
int my_strlen(char* c);
void reverse_string(char* c,int size)
{
//不递归
//让c[0]和c[size-1]交换
//用left和right指针
int left = 0, right = size - 1;
while (left < right)
{
char d = c[left];
c[left] = c[right];
c[right] = d;
left++;
right--;
}
}
//递归
void reverse_string2(char* c)
{
//递归
//*c=c[size-1]
// reverse_string2(c+1);
//size=my_strlen(c)
//int size = my_strlen(c);//c的长度
//char a = ' ';
//if (*c != '\0')
//{
// a = *c;
// *c = *(c + size - 1);
// *(c + size - 1) = '\0';
// reverse_string2(c + 1);
//}
//*(c + size - 1) = a;
int len = my_strlen(c);
char tmp = *c;
*c = *(c + len - 1);
*(c + len - 1) = '\0';//因为在检测字符串长度时,以'\0'为字符串结束,防止被交换的数再次交换
if (my_strlen(c + 1) >= 2)//如果还能交换,就交换,否则就只剩一个字符,让他原地不动
reverse_string2(c + 1);
*(c + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0])-1;
printf("%s\n", arr);
//reverse_string(arr,sz);
reverse_string2(arr);
printf("%s\n", arr);
return 0;
}
int my_strlen(char* c)
{
int count = 0;
while (*c != '\0')
{
count++;
c++;
}
if (*c == '\0')
return count;
}