自习室的泡利不相容定律(C语言实现)

该博客介绍了一个使用C语言解决的编程问题,涉及递归函数和动态规划。问题背景是在一个自习室中,学生尽可能避免相邻就座,通过递归函数f(n)计算在n个座位上最多能坐多少人,从而得出坑位利用率。博主给出了函数f(n)的递推公式,并实现了C语言代码,计算并输出坑位利用率,保留两位小数。

自习室的泡利不相容定律(C语言实现)

描述:假设自习室只有一排n个靠窗座位,而在人数不多的时候同学们会尽可能远离其他人就座避免尴尬,确保自己的学习效率。若要让人数不会达到尴尬条件,以7个座位为例,两个同学占据第一个和最后一个座位,第三位同学占据4号座位,此时人数已达到饱和,新来的同学无论坐在2356哪个位置都会与至少一人相邻,所以7个座位只能让3个同学坐。现输入座位个数n,编程输出这间自习室的坑位利用率(饱和人数/座位数),保留两位小数,第三位四舍五入。

输入:

输入一个正整数n(1<=n<=10000)

输出:

输出坑位利用率,保留两位小数,第三位四舍五入。

输入样例 1: 5

输出样例 1:60.00%


思路:本题用C语言来实现。用到函数递归的思想。首先定义一个函数f(n),功能是求出x个座位下按题目要求最多能坐的人数。很明显n<=4的时候只能做头尾两边,并且满足f(1)=1,f(2)=1,f(3)=2,f(4)=2。那么当n>=5的时候,就要寻找他们的关系了。f(n)能否看成两个更小的数x,y的f(x),f(y)的某种关系呢?仔细分析,将f(7)第三个人坐的位置可以看做两个f(4)的某种关系,将f(8)从第三个人坐的位置可以看做f(4)和f(5)的某种关系。多列举几项,就找到规律:n为奇数时,对应的两个更小的数都是(n/2+1)1;n为偶数时对应的两个更小的数是n/2和n/2+1;由于拆分时中间的位置被算了2次,因此最后返回的值要减去1。

#include <stdio.h>
int main()
{
	int f(int x);//求x个座位最多坐的人数
	int x;
	double rate;
	scanf("%d",&x);
	rate=(double)(f(x)*100)/(double)(x);
	printf("%.2f%%",rate);
}


int f(int x)
{
	if(x==1||x==2)
	return 1;
	if(x==3||x==4)
	return 2;
	if(x>=5)
	{
		if(x%2==0)
		return f(x/2)+f(x/2+1)-1;
		else
		if(x%2==1)
		return f(x/2+1)*2-1;
	}
}

  1. c语言存在隐式转换。
    f ( n ) = { f ( n / 2 ) + f ( n / 2 + 1 ) − 1 n 是偶数 f ( n / 2 + 1 ) + f ( n / 2 + 1 ) − 1 n 是奇数 f(n)=\begin{cases} f(n/2)+f(n/2+1)-1 & n是偶数 \\ f(n/2+1)+f(n/2+1)-1 & n是奇数 \\ \end{cases} f(n)={f(n/2)+f(n/2+1)1f(n/2+1)+f(n/2+1)1n是偶数n是奇数 ↩︎

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值