積分分為兩種,數(shù)值積分,公式積分。
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務嵩縣,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
公式積分:部分函數(shù)可以直接用公式求得其不定積分函數(shù)。C語言中可以直接用積分公式寫出其積分函數(shù)。
數(shù)值積分:按照積分的定義,設置積分范圍的步長,用梯形面積累加求得其積分。
以【f(x)=x*sin(x) 從1到2的積分】為例:
#include?math.h
#include?stdio.h
double?integral(double(*fun)(double?x),double?a,double?b,int,n){
double?s,h,y;
int?i;
s=(fun(a)+fun(b))/2;
h=(b-a)/n;?/*積分步長*/
for(i=1;in;i++)
s=s+fun(a+i*h);
y=s*h;
return?y;/*返回積分值*/
}
double?f(double?x){
return(x*sinx)??/*修改此處可以改變被積函數(shù)*/
}
int?main(){
double?y;
y=integral(f,1.0,2.0,150);/*修改此處可以改變積分上下限和步數(shù),步長=(上限-下限)/步數(shù)*/
printf("y=%f\n",y);
return?0;
}
#include math.h
int primeNum(int p)
{
int i, q;
/* Negative number is not a prime */
if (p 0)
return 0;
q = (int) sqrt(p);
for (i = 2; i q; i++)
if ((p % i) == 0)
return 0;
/* No factor of p is found */
return 1;
}
/*原理::
從2-sqrt(x)的數(shù)中看是否有可以整除的, 如果沒有, 則為素數(shù).
*/
哈夫曼編碼(Huffman Coding)是一種編碼方式,以哈夫曼樹—即最優(yōu)二叉樹,帶權路徑長度最小的二叉樹,經(jīng)常應用于數(shù)據(jù)壓縮。 在計算機信息處理中,“哈夫曼編碼”是一種一致性編碼法(又稱"熵編碼法"),用于數(shù)據(jù)的無損耗壓縮。這一術語是指使用一張?zhí)厥獾木幋a表將源字符(例如某文件中的一個符號)進行編碼。這張編碼表的特殊之處在于,它是根據(jù)每一個源字符出現(xiàn)的估算概率而建立起來的(出現(xiàn)概率高的字符使用較短的編碼,反之出現(xiàn)概率低的則使用較長的編碼,這便使編碼之后的字符串的平均期望長度降低,從而達到無損壓縮數(shù)據(jù)的目的)。這種方法是由David.A.Huffman發(fā)展起來的。 例如,在英文中,e的出現(xiàn)概率很高,而z的出現(xiàn)概率則最低。當利用哈夫曼編碼對一篇英文進行壓縮時,e極有可能用一個位(bit)來表示,而z則可能花去25個位(不是26)。用普通的表示方法時,每個英文字母均占用一個字節(jié)(byte),即8個位。二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多。倘若我們能實現(xiàn)對于英文中各個字母出現(xiàn)概率的較準確的估算,就可以大幅度提高無損壓縮的比例。
本文描述在網(wǎng)上能夠找到的最簡單,最快速的哈夫曼編碼。本方法不使用任何擴展動態(tài)庫,比如STL或者組件。只使用簡單的C函數(shù),比如:memset,memmove,qsort,malloc,realloc和memcpy。
因此,大家都會發(fā)現(xiàn),理解甚至修改這個編碼都是很容易的。
背景
哈夫曼壓縮是個無損的壓縮算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬于可變代碼長度算法一族。意思是個體符號(例如,文本文件中的字符)用一個特定長度的位序列替代。因此,在文件中出現(xiàn)頻率高的符號,使用短的位序列,而那些很少出現(xiàn)的符號,則用較長的位序列。
編碼使用
我用簡單的C函數(shù)寫這個編碼是為了讓它在任何地方使用都會比較方便。你可以將他們放到類中,或者直接使用這個函數(shù)。并且我使用了簡單的格式,僅僅輸入輸出緩沖區(qū),而不象其它文章中那樣,輸入輸出文件。
bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *pDes, int nDesLen);
bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *pDes, int nDesLen);
要點說明
速度
為了讓它(huffman.cpp)快速運行,我花了很長時間。同時,我沒有使用任何動態(tài)庫,比如STL或者MFC。它壓縮1M數(shù)據(jù)少于100ms(P3處理器,主頻1G)。
壓縮
壓縮代碼非常簡單,首先用ASCII值初始化511個哈夫曼節(jié)點:
CHuffmanNode nodes[511];
for(int nCount = 0; nCount 256; nCount++)
nodes[nCount].byAscii = nCount;
然后,計算在輸入緩沖區(qū)數(shù)據(jù)中,每個ASCII碼出現(xiàn)的頻率:
for(nCount = 0; nCount nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
然后,根據(jù)頻率進行排序:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
現(xiàn)在,構造哈夫曼樹,獲取每個ASCII碼對應的位序列:
int nNodeCount = GetHuffmanTree(nodes);
構造哈夫曼樹非常簡單,將所有的節(jié)點放到一個隊列中,用一個節(jié)點替換兩個頻率最低的節(jié)點,新節(jié)點的頻率就是這兩個節(jié)點的頻率之和。這樣,新節(jié)點就是兩個被替換節(jié)點的父節(jié)點了。如此循環(huán),直到隊列中只剩一個節(jié)點(樹根)。
// parent node
pNode = nodes[nParentNode++];
// pop first child
pNode-pLeft = PopNode(pNodes, nBackNode--, false);
// pop second child
pNode-pRight = PopNode(pNodes, nBackNode--, true);
// adjust parent of the two poped nodes
pNode-pLeft-pParent = pNode-pRight-pParent = pNode;
// adjust parent frequency
pNode-nFrequency = pNode-pLeft-nFrequency + pNode-pRight-nFrequency;
這里我用了一個好的訣竅來避免使用任何隊列組件。我先前就直到ASCII碼只有256個,但我分配了511個(CHuffmanNode nodes[511]),前255個記錄ASCII碼,而用后255個記錄哈夫曼樹中的父節(jié)點。并且在構造樹的時候只使用一個指針數(shù)組(ChuffmanNode *pNodes[256])來指向這些節(jié)點。同樣使用兩個變量來操作隊列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。
接著,壓縮的最后一步是將每個ASCII編碼寫入輸出緩沖區(qū)中:
int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex3)) |=
nodes[pSrc[nCount]].dwCode (nDesIndex7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
(nDesIndex3): 3 以8位為界限右移后到達右邊字節(jié)的前面
(nDesIndex7): 7 得到最高位.
注意:在壓縮緩沖區(qū)中,我們必須保存哈夫曼樹的節(jié)點以及位序列,這樣我們才能在解壓縮時重新構造哈夫曼樹(只需保存ASCII值和對應的位序列)。
解壓縮
解壓縮比構造哈夫曼樹要簡單的多,將輸入緩沖區(qū)中的每個編碼用對應的ASCII碼逐個替換就可以了。只要記住,這里的輸入緩沖區(qū)是一個包含每個ASCII值的編碼的位流。因此,為了用ASCII值替換編碼,我們必須用位流搜索哈夫曼樹,直到發(fā)現(xiàn)一個葉節(jié)點,然后將它的ASCII值添加到輸出緩沖區(qū)中:
int nDesIndex = 0;
DWORD nCode;
while(nDesIndex nDesLen)
{
nCode = (*(DWORD*)(pSrc+(nSrcIndex3)))(nSrcIndex7);
pNode = pRoot;
while(pNode-pLeft)
{
pNode = (nCode1) ? pNode-pRight : pNode-pLeft;
nCode = 1;
nSrcIndex++;
}
pDes[nDesIndex++] = pNode-byAscii;
}
#include stdio.h
#includestdlib.h
#includestring.h /*頭文件*/
int find(char srt[],char xCh); /*函數(shù)要聲明*/
void main() /*main()不是這樣寫吧*/
{
int cs; /*i時什么東西*/
char a,k[100]; /*char a,k;字符串數(shù)組不是這樣聲明*/
/*int find(char srt,char xCh);這個放到上面聲明*/
/*clrscr();這個有什么用?*/
printf("input a char\n");
scanf("%c",a); /*scanf("%s",a);錯*/
printf("input a find\n");
scanf("%s",k);
cs=find(k,a); /*cs=find(a,k);*/
printf("%d\n",cs);
}
int find(char srt[],char xCh) /*int findchar srt,char xCh要用()這個,不能用還有錯誤自己對照*/
{
int j,cs=0,len=strlen(srt);
char*p; /* int *p;*/
p=srt;
/*下面這部分自己看,和你自己的對照一下*/
for(j=0;jlen;j++)
{
if(*(p+j)==xCh)
{
cs++;
printf("%d \n",j);} }
/*這個干嗎用?*/
return(cs);
}
/*改了我好長時間,給分啊~~~*/
#include?stdio.h
int?main?()
{
int?ad(int);
int?n;
printf("請輸入一個測試數(shù):");
while(scanf("%d",n)==1)
if(ad(n))
printf("\t?%d?是??素數(shù).\n",n);
else?
printf("\t?%d?不是素數(shù).\n",n);
return?0;
}
int?ad(int?n)
{
int?flag=1,i;
for?(i=2;i=n/2??flag==1;i++)??//?這里?i=n/2就好了
if(n%i==0)
flag=0;
return?(flag);
}
代碼有點小問題,參看上面的注釋