您的位置:

装错信封问题c语言,装错信封问题c语言怎么办

本文目录一览:

用C++数组解

由于已经给出递推公式,那这个代码的实现其实很简单,如以下代码

int D[11];

D[1] = 0;

D[2] = 1;

for (int i = 3; i = 10; ++i) {

    D[i] = (i - 1) * (D[i - 1] + D[i - 2]);

}

定义一个数组,初始化前两位,然后再根据公式迭代计算

组合问题

这个是装错信封类的变题

为方便,我们先把n个不同的元素及相应的位置都编上序号1,2,…,n,并且约定:在n个不同元素的排列中

1°若编号为i(i=1,2,…,n)的元素排在第i个位置,则称元素i在原位;否则称元素i不在原位.

2°若所有的元素都不在原位,则称这种排列为n个不同元素的一个错排(若每个元素都在原位则称为序排).

按照上面约定,“装错信封问题”即为n个不同元素的错排问题,则可构建“装错信封问题”的数学模型为

在n个不同元素的全排列中,有多少种不同的错排?

3 模型求解

应用集合中的容斥原理,我们就可得到“装错信封问题”的数学模型的求解公式.

设I表示n个不同元素的全排列的集合

Ai(i=1,2,…,n)为元素i在原位的排列的集合

Ai∩Aj(1≤i<j≤n)为元素i与j在原位的排列的集合……

A1∩A2∩…∩An为n个元素的序排的集合.

则它们的排列数(即各个集合中元素的个数)分别为

|I|=n!

|Ai|=(n-1)!

|Ai∩Aj|=(n-2)!

……

……

|A1∩A2∩…∩An|=(n-n)!=0!

根据容斥原理即得“装错信封问题”的数学模型的求解公式(即n个不同元素的错排数)为f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!]

f(5)=44

有44种错放法

c语言问题 伯努利装错信封问题

全排列的筛选

#includestdio.h

#includestdlib.h

int printed;

void draw(int* a,int k)

{

    int i;

    for(i=0;ik;i++)

    {

        printf("%d",a[i]);

    }

    printf("\n");

}

void Settle(int *a,int iStep,int k)

{  

    int i;

    for(i=0;iiStep-1;i++)

        if(a[iStep-1]==a[i]) return;

    if(iStep==k) 

    {

draw(a,k);

printed++;

    }

    for(i=1;i=k;i++)

    {

if(i==iStep+1) continue;

        a[iStep]=i;

        Settle(a,iStep+1,k);

    }

}

void main()

{

    int* a;

    int k;

    scanf("%d",k);

    a=(int*)calloc(k,sizeof(int));

    Settle(a,0,k);

    printf("s=%d\n",printed);

}

初中递归题

一只母兔从四岁开始每年生一只小母兔,按此规律,第N年时有多少只母兔?1、

楼梯有N阶,上楼可以一步上一价,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。

某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。

有一天小猴子摘若干个桃子,当即吃了一半还觉得不过瘾,又多吃了一个。第二天接着吃剩下桃子中的一半,仍觉得不过瘾又多吃了一个,以后小猴子都是吃尚存桃子一半多一个。到第10天早上小猴子再去吃桃子的时候,看到只剩下一个桃子。问小猴子第一天共摘下了多少个桃子。

写一个计算斐波那挈数列的递归函数(即后面一项为前两项之和)。

honoi问题: 设有三个塔座,依次命名为x,y,z。有z个直径不同的圆盘,由小到大依次编号为1、2、……,n。开始时,它们全部按递减的次序插在塔座上。现要求按下列规则把n个圆盘按次序插放在z塔座上。

(1)每次只能移动一个圆盘;

(2)圆盘可以从任一个塔座上移到另一个塔座上;

(3)任何时刻都不能把一个较大的圆盘压在较小的圆盘上。

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

有一栋楼房,假设有100层,我从第100层往下拣钱

每一层的钱等于楼层数 X 10 。例第1层是 1X10 = 10块钱

求100层我共拣到多少钱?

有一栋楼房,假设有10层。每一次的钱等于,

我从第10层往下拣,当前层的钱 = 以前层累加的钱

X 当前层数-1。问10层楼我共拣多少钱?[可以假设第1层是7块钱]

c语言题,n封信装入n个对应信封。问,全部装错的情况有几种。请用for和递归两种方法解决。

#include "stdio.h"

int ans = 0, n;

bool visit[30];

void dfs(int cur) {

  if (cur == n) {

    ++ans;

    return ;

  }

  for (int i = 0; i  n; ++i) {

    if (i == cur || visit[i])

      continue;

    visit[i] = true;

    dfs(cur + 1);

    visit[i] = false;

  }

}

main()

{

  scanf("%d", n);

  for (int i = 0; i  n; ++i)

    visit[i] = false;

  for (int i = 1; i  n; ++i) {

    visit[i] = true;

    dfs(1);

    visit[i] = false;

  }

  printf("%d\n", ans);

}

n不能太大,不然会运行很久的。

C语言编程题这题咋做啊

分析,假如有N封信和N个信封,

第一步:第一封信,错误信封情况:N-1个

第二步:假设与第一封信装错的信封为第A个信封,则此步就找第A个信封,与之匹配会出错的信封有N-1个

第三步(如果N大于2):与第M封信匹配错误的信封情况为N-2(M≠1,M≠A)

第四步:假设与第M封信装错的信封为第B个信封,则此步就找第B个信封,与之匹配会出错的信封有N-2个

……一次类推

算法就是(N-1)*(N-1)*(N-2)*(N-2)*…*1*1

自己想出来的,应该是对的,楼主自己测试看看,应该没错,代码就不写了,很简单的循环