某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况?
2017-07-28 22:26
363 查看
我这里用两种方法:
1.第一种是高中的全错位排列公式:S=n!(1-1/1!+1/2!-1/3!+...(-1)^n/n!)
C++代码如下:
#include <iostream>
using namespace std;
int main()
{
int n;
cout<<"请输入n:";
cin>>n;
int t=1, s=1, sum=0;
for(int i=2; i<=n; i++)s*=i;
for(int j=2; j<=n; j++){
t=1;
for(int i=2; i<=j; i++)t*=i;
if(j%2==0)sum+=s/t;
else sum-=s/t;
}
cout<<"共有"<<sum<<"种方法"<<endl;
return 0;
}
2.第二种是用总的n!减去所有信封装对的情况(哪怕只有一封装对也算)。
S=n!-C(n,1)f(n-1)-C(n,2)f(n-2)-...C(n,n-2)f(2)-1
C(n,m)=n!/[(n-m)!m!],符号没打出来,不好意思。
以下java代码是我自己写的,结果是一样的,就是看起来总是觉得不是很规范。我是用递归写的。
package digui;
import java.util.Scanner;
public class Envolope {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
System.out.println("装错信封共有情况"+envolopeError(n)+"种");
}
private static int envolopeError(int n) {
if(n==1)return 0;
if(n==2)return 1;
else {
int t=jieCheng(n);
for(int i=n-1; i>=2;i--)
t-=Cn(n,n-i)*envolopeError(i);
t-=1;
return t;
}
}
private static int jieCheng(int n){
if(n==1)return 1;
else return n*jieCheng(n-1);
}
private static int Cn(int n, int i){
int t=n;
for(int j=n-1;j>n-i;j--)t*=j;
return t/jieCheng(i);
}
}
1.第一种是高中的全错位排列公式:S=n!(1-1/1!+1/2!-1/3!+...(-1)^n/n!)
C++代码如下:
#include <iostream>
using namespace std;
int main()
{
int n;
cout<<"请输入n:";
cin>>n;
int t=1, s=1, sum=0;
for(int i=2; i<=n; i++)s*=i;
for(int j=2; j<=n; j++){
t=1;
for(int i=2; i<=j; i++)t*=i;
if(j%2==0)sum+=s/t;
else sum-=s/t;
}
cout<<"共有"<<sum<<"种方法"<<endl;
return 0;
}
2.第二种是用总的n!减去所有信封装对的情况(哪怕只有一封装对也算)。
S=n!-C(n,1)f(n-1)-C(n,2)f(n-2)-...C(n,n-2)f(2)-1
C(n,m)=n!/[(n-m)!m!],符号没打出来,不好意思。
以下java代码是我自己写的,结果是一样的,就是看起来总是觉得不是很规范。我是用递归写的。
package digui;
import java.util.Scanner;
public class Envolope {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
System.out.println("装错信封共有情况"+envolopeError(n)+"种");
}
private static int envolopeError(int n) {
if(n==1)return 0;
if(n==2)return 1;
else {
int t=jieCheng(n);
for(int i=n-1; i>=2;i--)
t-=Cn(n,n-i)*envolopeError(i);
t-=1;
return t;
}
}
private static int jieCheng(int n){
if(n==1)return 1;
else return n*jieCheng(n-1);
}
private static int Cn(int n, int i){
int t=n;
for(int j=n-1;j>n-i;j--)t*=j;
return t/jieCheng(i);
}
}
相关文章推荐
- (递归)某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。
- 把一张面值为一元的纸币,换成一分,二分,五分的硬币,共有多少种换法?编程输出每一种不同的换法。 如果每种硬币至少有一个,编程求出所需硬币最少的数目及换法。
- 一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?
- CSU 1021 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下: C(m, n) = m!/((m - n)!n!) 现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。
- 一对耗子每个月生一对小耗子,小耗子成长3个月,从第4个月开始也可以每个月生一对小耗子。假如所有的耗子都不死的情况下,2年(24个月)后一共有多少只耗子?
- Activty与Service通信的所有情况(相同进程、不同进程)
- 传入一个字符串参数 获取这个字符串内所有字符的 不同排列情况
- 一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- 填算式 ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法?
- 问题五十七: 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编程序计算共有多少种不同的走法?
- 某个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?
- 2015C++第二周,任务七:以不同的形式输出日期,月份以英文显示,涉及类,构造函数等等,并限定月份只有12个月,日期与实际情况相同,如果输入错误则显示为0.
- 一个问题:物理内存有限的情况下,多个进程存在时,每个进程实际分配的物理内存有多少?(如果某程序申请了很大的动态存储空间)
- 二、给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。
- 网易面试题之 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
- 编程实现 1元,2元,5元,100元纸币组成800元,共有多少种情况。?
- 楼梯上有n阶台阶,上楼时可以一步上1阶,也可以一步上两阶,编写算法计算共有多少种不同的上楼梯的方法。
- 网易面试题之 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
- 共有5中颜色的球若干个,取3个球,每个颜色都不同,问有多少种取法;