5.3 代码

文章介绍了使用C++解决关于排列问题(如28个元素全排列)的方法,以及处理包含闰年的日期计算,通过递归和数组优化来实现。
摘要由CSDN通过智能技术生成

目录

1.小蓝与钥匙

2.含2天数


1.小蓝与钥匙

解析:有十四个排错就是要先从28里面选出来14个,之后进行全排错,在网上找了全排错公式的推导

1.假设a放在了b的位置,那么b就有两种放置方法,第一种是b放在a的位置,那么就等于是除了a和b,剩下的n-2位排错,我们记为d(n-2),第二种情况就是b没有放在a的位置,那么就是b放在了其他的位置,也就是说是剩下的n-1位全排错了,我们记为d(n-1)位,这样的话总的来说就是第n位的全排错是d(n)=(n-1)*(d(n-1)+d(n-2)),所以第28位就可以用代码写出来,但是要注意

d(0)=0,d(2)=1

#include <bits/stdc++.h>

using namespace std;

main()
{
	int n,i;
	long long a[15];
	memset(a,0,sizeof(a));
	a[2]=1;
	for(i=3;i<=14;i++)
	{
		a[i]=(i-1)*(a[i-1]+a[i-2]);
		cout<<a[i]<<endl;
	}
	cout<<a[14];
}

运行结果是32071101049,在这里要注意a数组的值是可能很大的,要设置成long long类型

接着就是比较简单的取计算c(28,14)了,这个也有一个公式是

c(n,k)=c(n-1,k-1)+c(n-1,k)

#include <bits/stdc++.h>

using namespace std;

f(int n,int k)
{
	if(k==0 ||k==n)
	return 1;
	else return f(n-1,k-1)+f(n-1,k);
 } 

main()
{
	cout<<f(28,14); 
}

运行结果是40116600

然后两者乘一下就是答案了,算出来的是1,286,583,532,342,313,400

2.含2天数

这个就是纯粹的遍历了,感觉还是要看看别人才能发现比较好的算法,对我来说比较需要改进的就是年份可以先用数组表示,其次来说闰年公式是if(i%400=0 ||(i%4==0 &&1%100!=0),感觉很奇怪,感觉代码没问题但是跑不出来结果,循环一直停不下来,先放着吧,过几天再来看看

#include <bits/stdc++.h>

using namespace std;
bool f(long long n)
{
	while(n>0)
	{
	   if(n%10!=2)
	   {
		  n=n/10;
	   }	
	   else return true; 
	}
	return false;	
}

main()
{
	long long i,j,k,ans=0;
	long long day[]={31,28,31,30,31,30,31,31,30,31,30,31};
	for(i=1900;i<=9999;i++)
	{
		if(i%400==0 ||(i%4==0 && i%100!=0))
		{
			day[2]=29;
		}
		else day[2]=28;
		for(j=1;j<=12;j++)
		{
			for(k=1;k<=day[j];k++)
			{
				if(f(i)|| f(j) ||f(k))
				{
					cout<<"*0"<<endl;
					ans=ans+1;
					cout<<ans<<endl;
				}
				cout<<"-------------"<<endl;
			}
		}
		cout<<"///"<<endl;
	}
	cout<<ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值