本文目錄一覽:
- 1、用C++數組解
- 2、組合問題
- 3、c語言問題 伯努利裝錯信封問題
- 4、初中遞歸題
- 5、c語言題,n封信裝入n個對應信封。問,全部裝錯的情況有幾種。請用for和遞歸兩種方法解決。
- 6、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
自己想出來的,應該是對的,樓主自己測試看看,應該沒錯,代碼就不寫了,很簡單的循環
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182036.html