初阶C语言——函数(一)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值