C语言函数练习

目录

1. 写一个函数可以判断一个数是不是素数。

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

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

4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。


1. 写一个函数可以判断一个数是不是素数。

让我们先回顾下小学学习到的素数的概念吧:

直观判断 素数的定义是,除了能被1和它本身整除而不能被其他任何数整除的数。

知道了素数的定义,那这道题就很好解决了。根据素数定义 只需要用2到n-1去除n,如果都除不尽,则n是素数,否则,只要其中有一个数能整除则n不是素数。

如下:

//is prime()
//是素数返回1,不是素数返回0

#include<stdio.h>
int is_prime(int n)
{
	//2-n-1的数字试除
	int j = 0;
	for (j = 2; j < n; j++)
		//优化:
		//for (j = 2; j <=sqrt(n); j++)
		//sqrt:开平方
		//引头文件#include<math.h>
	{
		if (n % j == 0)
		{
			return 0;
		}
	}
	return 1;//素数
}
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数 - 如果是素数就打印i
		if (is_prime(i) == 1)
	  //if (is_prime(i))同上
		{
			printf("%d ", i);
		}
	}
	return 0;
}

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

写这道题之前,我们先梳理下什么是闰年吧!

闰年分为普通闰年和世纪闰年。

普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。

综上所述:我们只需要在调用函数里面引用一个if语句来判断是否为闰年的条件。即(若年份除以4=0)并且(年份%100的余数不等于0,即不能整除100)或者(或者年份是400的倍数,即年份%400=0),满足上述条件即可判断是否为年份。用C语言表达为:if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)),当是闰年时,返回1,在主函数来接收这个闰年。并在主函数创建for循环以此来打印所有的闰年:

法一:

#include<stdio.h>
int is_leap_year(int y)
{
	if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断y是否是闰年
		if (is_leap_year(y))
		{
			printf("%d ", y);
		}
	}
	return 0;
}

当然上述代码也可进行部分的优化:如下

int is_leap_year(int y)
{
	return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0));
}
int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断y是否是闰年
		if (is_leap_year(y))
		{
			printf("%d ", y);
		}
	}
	return 0;
}

 只是在函数的判断部分简易优化下而已。

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

//如果找到了,就返回下标
//找不到返回-1

写这道题前,我们需要对二分查找进行一个系统的认知:

假设我们创建一个整型数组 int arr[10]={1,2,3,4,5,6,7,8,9,10},如果我们要访问数字k=7,求7的数字下标是多少,这道题我们肉眼可见的答案是下表为6,可是计算机不能肉眼看出,这就需要用到二分查找来完成这个问题。

二分查找解决问题的宗旨是用数组下标第一个和数组下标最后一个相加 /2,若得到的数组下标的值<k,那么就以这个得到的数组下标加1,再加上右边的值除以二,以此类推,直到左值大于等于右值,则跳出循环。用图来简析下

#include<stdio.h>
int binary_search(int arr[], int k,int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left<=right)
	{
		int mid = (left + right) / 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;
	//其实数组arr传给binary_search函数的时候,其实传递的是arr数组首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = binary_search(arr, k, sz);
	if (-1 == ret)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了,下标是%d\n", ret);
	}
}

 

4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。

法一:

#include<stdio.h>
void add(int *num)
{
	*num = *num + 1;
}
int main()
{
	int num = 0;
	add(&num);
	printf("%d\n", num);
	add(&num);
	printf("%d\n", num);
	add(&num);
	printf("%d\n", num);
	return 0;
}

 法二:

#include<stdio.h>
int add(int num)
{
	num++;
	return num;
}
int main()
{
	int num = 0;
	num = add(num);
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	return 0;
}

法三:

#include<stdio.h>
int add(int num)
{
	return ++num;      //正确(先++,后使用)
	//return num + 1;  //正确
	//return num++;    //错误(先使用,后++)
}
int main()
{
	int num = 0;
	num = add(num);
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	num = add(num);
	printf("%d\n", num);
	return 0;
}
  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三分苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值