例題4-1 組合數
輸入非負整數m,n輸出組合數c(n,m).m<=n<=20
分析:從普通思維出發先算n!,再算m!,再算(n-m)!,最終我們會發現,20!以及超出整數所能表示的範圍。因此此題不宜使用這種方法。經分析,我們發現n!和m!或者(n-m)!有重疊的部分,可以約去。因此得到如下解法:
**
#includeusing namespace std;
int f(int n,int m)
return res;
}int main()
,例如c(20,7),按上面的演算法為res=14/1*15/2*16/3*17/4*18/5*19/6*20/7,之所以能這麼做是因為對j來說,分母在j個數之內肯定有能被j整除的整數出現,例如j=2時,兩個數之內就有能被2整除的整數出現。所以,這個演算法正確。
例4-2 孿生素數
如果n和n+2都是素數,則稱它們是孿生素數。輸入m,輸出兩個數均不超過m的最大孿生素數。5≤m≤10000。例如m=20時答案是17、19,m=1000時答案是881、883。
分析:被1和它自身整除的、大於1的整數稱為素數。由於要判斷n和n+2是否是素數,所以把「判斷素數」可以寫成乙個函式,只需呼叫這個函式兩次就可以了。這樣的「判斷乙個事物是否具有某一性質」的函式還有乙個學術名稱——謂詞(predicate)
**:
#include "stdafx.h"
#include #include int is_primer(int x)
return 1;
}int _tmain(int argc, _tchar* argv)
} return 0;
}
4.4.1 小問題錦集
首先,來編寫乙個函式solve,給定浮點數a,b,c,d,e,f,求解方程組ax+by=c,dx+ey=f
任務1:使用assert巨集,讓解不唯一時異常退出
任務2:解不唯一時仍然正常返回,但呼叫者有辦法知道解的數量(無解、唯一解、無窮多組解)
分析:從線性代數的知識可知,當行列式det=a*e-b*d!=0時,方程有唯一解,這是任務一的思路。其次,當det=0時,方程有兩種可能,有無窮解,無解。令detx=c*e-b*f,有det=detx時有無窮解,det!=detx時無解
**:
任務1:
#include "stdafx.h"
#include #includeusing namespace std;
int solve(double a,double b,double c,double d,double e,double f,double *x,double *y)
if(detx==0 && detx!=det)
*x=detx/det;
*y=dety/det;
cout<
第四章 函式
樣例1,不帶引數的函式 create or replace function helloworld return varchar2 is begin return 朋友,您好 end 呼叫函式 語句的呼叫 select helloworld from dual 第二種呼叫方法 pl sql塊 beg...
第四章 函式
知識點 1 函式 function 可接受輸入 執行指令 返回輸出的復合語句。呼叫函式,意味著提供輸入。每乙個輸入就是乙個引數,為函式提供引數稱之為 傳參 2 呼叫函式的語句 函式名 逗號分隔的引數 f x x 2 語句左側定義乙個函式 f 接受乙個引數 x 右側是函式具體定義,利用 x 中傳遞的引...
第四章 分治法例題
給定由n個整數組成的序列 a1,a2,an 最大子段和問題要求該序列形如 的最大值 1 i j n 當序列中所有整數均為負整數時,其最大子段和為0。例如,序列 20,11,4,13,5,2 的 最大子段和為 a1,an的最大子段和 a1,a 的最大子段和 a1,an的最大子段和 a 1,an的最大子...