當前位置:首頁 » 操作系統 » 演算法c代碼實現

演算法c代碼實現

發布時間: 2023-03-01 12:15:18

『壹』 c語言實現七種排序演算法的演示代碼是什麼

(1)「冒泡法」 x0dx0ax0dx0a冒泡法大家都較熟悉。其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序。下面列出其代碼:x0dx0ax0dx0avoid bubble(int *a,int n) /*定義兩個參數:數組首地址與數組大小*/ x0dx0ax0dx0a{ x0dx0ax0dx0aint i,j,temp; x0dx0ax0dx0afor(i=0;ia[j]) { x0dx0ax0dx0atemp=a[i]; x0dx0ax0dx0aa[i]=a[j]; x0dx0ax0dx0aa[j]=temp; x0dx0ax0dx0a} x0dx0ax0dx0a} x0dx0ax0dx0a冒泡法原理簡單,但其缺點是交換次數多,效率低。 x0dx0ax0dx0a下面介紹一種源自冒泡法但更有效率的方法「選擇法」。 x0dx0ax0dx0a(2)「選擇法」 x0dx0ax0dx0a選擇法循環過程與冒泡法一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。x0dx0ax0dx0avoid choise(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0aint i,j,k,temp; x0dx0ax0dx0afor(i=0;ia[j]) k=j; /*是k總是指向最小元素*/ x0dx0ax0dx0aif(i!=k) { /*當k!=i是才交換,否則a[i]即為最小*/ x0dx0ax0dx0atemp=a[i]; x0dx0ax0dx0aa[i]=a[k]; x0dx0ax0dx0aa[k]=temp; x0dx0ax0dx0a} x0dx0ax0dx0a} x0dx0ax0dx0a} x0dx0ax0dx0a選擇法比冒泡法效率更高,但說到高效率,非「快速法」莫屬,現在就讓我們來了解它。 x0dx0ax0dx0a(3)「快速法」 x0dx0ax0dx0a快速法定義了三個參數,(數組首地址*a,要排序數組起始元素下標i,要排序數組結束元素下標j). 它首先選一個數組元素(一般為a[(i+j)/2],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。然後運用遞歸,在將它左,右兩個子數組排序,最後完成整個數組的排序。下面分析其代碼:x0dx0ax0dx0avoid quick(int *a,int i,int j) x0dx0ax0dx0a{ x0dx0ax0dx0aint m,n,temp; x0dx0ax0dx0aint k; x0dx0ax0dx0am=i; x0dx0ax0dx0an=j; x0dx0ax0dx0ak=a[(i+j)/2]; /*選取的參照*/ x0dx0ax0dx0ado { x0dx0ax0dx0awhile(a[m]k&&n>i) n--; /* 從右到左找比k小的元素*/ x0dx0ax0dx0aif(m<=n) { /*若找到且滿足條件,則交換*/ x0dx0ax0dx0atemp=a[m]; x0dx0ax0dx0aa[m]=a[n]; x0dx0ax0dx0aa[n]=temp; x0dx0ax0dx0am++; x0dx0ax0dx0an--; x0dx0ax0dx0a} x0dx0ax0dx0a}while(m<=n); x0dx0ax0dx0aif(mi) quick(a,i,n); x0dx0ax0dx0a} x0dx0ax0dx0a(4)「插入法」 x0dx0ax0dx0a插入法是一種比較直觀的排序方法。它首先把數組頭兩個元素排好序,再依次把後面的元素插入適當的位置。把數組元素插完也就完成了排序。x0dx0ax0dx0avoid insert(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0aint i,j,temp; x0dx0ax0dx0afor(i=1;i=0&&temp=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。下面讓我們來分析其代碼:x0dx0ax0dx0avoid shell(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0aint i,j,k,x; x0dx0ax0dx0ak=n/2; /*間距值*/ x0dx0ax0dx0awhile(k>=1) { x0dx0ax0dx0afor(i=k;i=0&&x x0dx0ax0dx0a/*別偷懶,下面的"..."代表函數體,自己加上去哦!*/ x0dx0ax0dx0avoid bubble(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0a... x0dx0ax0dx0a} x0dx0ax0dx0avoid choise(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0a... x0dx0ax0dx0a} x0dx0ax0dx0avoid quick(int *a,int i,int j) x0dx0ax0dx0a{ x0dx0ax0dx0a... x0dx0ax0dx0a} x0dx0ax0dx0avoid insert(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0a... x0dx0ax0dx0a} x0dx0ax0dx0avoid shell(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0a... x0dx0ax0dx0a} x0dx0ax0dx0a/*為了列印方便,我們寫一個print吧。*/[code]x0dx0ax0dx0avoid print(int *a,int n) x0dx0ax0dx0a{ x0dx0ax0dx0aint i; x0dx0ax0dx0afor(i=0;i

『貳』 演算法編程:用c語言實現

解決這類問題可以使用 回溯 演算法,代碼如下:

#include<stdio.h>
#include<stdlib.h>

#defineM6//候選數字個數
#defineN5//組合後數字位數

intcheck(intresult[],inti)
{
for(intj=0;j<N;j++)
if(result[j]==i)
return0;

return1;
}

intlist(intnumbers[],intl,intresult[],intcount)
{
if(l>=N){

//將各位數組合成一個數
intnum=0;
for(inti=0;i<N;i++){
num=num*10+numbers[result[i]];
}

//判斷這個數是否能被75整除
if(num%75==0){
printf("%d ",num);
count++;
}

returncount;
}

for(inti=0;i<M;i++){

if(!check(result,i)){
continue;
}

result[l]=i;

count=list(numbers,l+1,result,count);

result[l]=-1;
}

returncount;
}

intmain()
{
intnumbers[M]={1,2,5,7,8,9};
intresult[N]={-1,-1,-1,-1,-1};

intcount=list(numbers,0,result,0);

printf("共有%d個 ",count);

system("pause");
return0;
}

運行結果:

『叄』 C語言 查找演算法實現

#include

int main() {
int i,x,n,*result = NULL;
int a[10],low,high,mid;

scanf_s("%d",&n);
// 確保輸入的數據是非遞減的
for(i = 0 ; i < n && i < 10 ; i++) {
scanf_s("%d",&a[i]);
}

fflush(stdin); // 如果輸入的數組元素多於10個,則廢棄
scanf_s("%d",&x);

low = 0,high = n - 1;
while(low <= high) {
mid = (low + high) / 2;
if(x == a[mid]) {
result = &a[mid]; // 這里給出的是查找到該元素的指針
break;
}
else if(x < a[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
if(result != NULL) {
printf("%d\n",*result);
}
else {
printf("no result\n");
}
return 0;
}

『肆』 如何用C語言實現RSA演算法

RSA演算法它是第一個既能用於數據加密也能用於數字簽名的演算法。它易於理解和操作,也很流行。演算法的名字以發明者的名字
命名:Ron Rivest, Adi Shamir 和Leonard
Adleman。但RSA的安全性一直未能得到理論上的證明。它經歷了各種攻擊,至今未被完全攻破。

一、RSA演算法 :

首先, 找出三個數, p, q, r,
其中 p, q 是兩個相異的質數, r 是與 (p-1)(q-1) 互質的數
p, q, r 這三個數便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)
這個 m 一定存在, 因為 r 與 (p-1)(q-1) 互質, 用輾轉相除法就可以得到了
再來, 計算 n = pq
m, n 這兩個數便是 public key

編碼過程是, 若資料為 a, 將其看成是一個大整數, 假設 a < n
如果 a >= n 的話, 就將 a 表成 s 進位 (s <= n, 通常取 s = 2^t),
則每一位數均小於 n, 然後分段編碼
接下來, 計算 b == a^m mod n, (0 <= b < n),
b 就是編碼後的資料

解碼的過程是, 計算 c == b^r mod pq (0 <= c < pq),
於是乎, 解碼完畢 等會會證明 c 和 a 其實是相等的 :)

如果第三者進行竊聽時, 他會得到幾個數: m, n(=pq), b
他如果要解碼的話, 必須想辦法得到 r
所以, 他必須先對 n 作質因數分解
要防止他分解, 最有效的方法是找兩個非常的大質數 p, q,
使第三者作因數分解時發生困難
<定理>
若 p, q 是相異質數, rm == 1 mod (p-1)(q-1),
a 是任意一個正整數, b == a^m mod pq, c == b^r mod pq,
則 c == a mod pq

證明的過程, 會用到費馬小定理, 敘述如下:
m 是任一質數, n 是任一整數, 則 n^m == n mod m
(換另一句話說, 如果 n 和 m 互質, 則 n^(m-1) == 1 mod m)
運用一些基本的群論的知識, 就可以很容易地證出費馬小定理的

<證明>
因為 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整數
因為在 molo 中是 preserve 乘法的
(x == y mod z and u == v mod z => xu == yv mod z),
所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq

1. 如果 a 不是 p 的倍數, 也不是 q 的倍數時,
則 a^(p-1) == 1 mod p (費馬小定理) => a^(k(p-1)(q-1)) == 1 mod p
a^(q-1) == 1 mod q (費馬小定理) => a^(k(p-1)(q-1)) == 1 mod q
所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1
即 a^(k(p-1)(q-1)) == 1 mod pq
=> c == a^(k(p-1)(q-1)+1) == a mod pq

2. 如果 a 是 p 的倍數, 但不是 q 的倍數時,
則 a^(q-1) == 1 mod q (費馬小定理)
=> a^(k(p-1)(q-1)) == 1 mod q
=> c == a^(k(p-1)(q-1)+1) == a mod q
=> q | c - a
因 p | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod p
=> p | c - a
所以, pq | c - a => c == a mod pq

3. 如果 a 是 q 的倍數, 但不是 p 的倍數時, 證明同上

4. 如果 a 同時是 p 和 q 的倍數時,
則 pq | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod pq
=> pq | c - a
=> c == a mod pq
Q.E.D.

這個定理說明 a 經過編碼為 b 再經過解碼為 c 時, a == c mod n (n = pq)
但我們在做編碼解碼時, 限制 0 <= a < n, 0 <= c < n,
所以這就是說 a 等於 c, 所以這個過程確實能做到編碼解碼的功能

二、RSA 的安全性

RSA的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理論上的證明,因為沒有證明破解
RSA就一定需要作大數分解。假設存在一種無須分解大數的演算法,那它肯定可以修改成為大數分解演算法。目前, RSA
的一些變種演算法已被證明等價於大數分解。不管怎樣,分解n是最顯然的攻擊方法。現在,人們已能分解多個十進制位的大素數。因此,模數n
必須選大一些,因具體適用情況而定。

三、RSA的速度

由於進行的都是大數計算,使得RSA最快的情況也比DES慢上倍,無論是軟體還是硬體實現。速度一直是RSA的缺陷。一般來說只用於少量數據加密。

四、RSA的選擇密文攻擊

RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝( Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:

( XM )^d = X^d *M^d mod n

前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵--每個人都能使用公鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公
鑰協議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用
One-Way HashFunction 對文檔作HASH處理,或同時使用不同的簽名演算法。在中提到了幾種不同類型的攻擊方法。

五、RSA的公共模數攻擊

若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險的。最普遍的情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質,那末該信息無需私鑰就可得到恢復。設P為信息明文,兩個加密密鑰為e1和e2,公共模數是n,則:

C1 = P^e1 mod n

C2 = P^e2 mod n

密碼分析者知道n、e1、e2、C1和C2,就能得到P。

因為e1和e2互質,故用Euclidean演算法能找到r和s,滿足:

r * e1 + s * e2 = 1

假設r為負數,需再用Euclidean演算法計算C1^(-1),則

( C1^(-1) )^(-r) * C2^s = P mod n

另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數的一對e和d,一是有利於攻擊者分解模數,一是有利於攻擊者計算出其它成對的e』和d』,而無需分解模數。解決辦法只有一個,那就是不要共享模數n。

RSA的小指數攻擊。 有一種提高 RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易於實現,速度有
所提高。但這樣作是不安全的,對付辦法就是e和d都取較大的值。

RSA演算法是
第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。RSA是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人
們接受,普遍認為是目前最優秀的公鑰方案之一。RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA
的重大缺陷是無法從理論上把握它的保密性能
如何,而且密碼學界多數人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。B)分組長度太大,為保證安全性,n 至少也要 600
bits
以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。目
前,SET( Secure Electronic Transaction )協議中要求CA採用比特長的密鑰,其他實體使用比特的密鑰。

C語言實現

#include <stdio.h>
int candp(int a,int b,int c)
{ int r=1;
b=b+1;
while(b!=1)
{
r=r*a;
r=r%c;
b--;
}
printf("%d\n",r);
return r;
}
void main()
{
int p,q,e,d,m,n,t,c,r;
char s;
printf("please input the p,q: ");
scanf("%d%d",&p,&q);
n=p*q;
printf("the n is %3d\n",n);
t=(p-1)*(q-1);
printf("the t is %3d\n",t);
printf("please input the e: ");
scanf("%d",&e);
if(e<1||e>t)
{
printf("e is error,please input again: ");
scanf("%d",&e);
}
d=1;
while(((e*d)%t)!=1) d++;
printf("then caculate out that the d is %d\n",d);
printf("the cipher please input 1\n");
printf("the plain please input 2\n");
scanf("%d",&r);
switch(r)
{
case 1: printf("input the m: "); /*輸入要加密的明文數字*/
scanf("%d",&m);
c=candp(m,e,n);
printf("the cipher is %d\n",c);break;
case 2: printf("input the c: "); /*輸入要解密的密文數字*/
scanf("%d",&c);
m=candp(c,d,n);
printf("the cipher is %d\n",m);break;
}
getch();
}

『伍』 對於循環隊列,試寫出求隊列含有多少個元素的演算法,並將演算法用C代碼實現。

對於循環隊列,求隊列含有多少個元素的演算法如下:

typedef struct
{
int tail,head;
int a[Max];
}queue;

void enqueue(int key,queue&q)
{
q.a[q.tail]=key;
q.tail=(q.tail+1)%Max;
}

int dequeue(queue&q)
{
int key;
key=q.a[q.head];
q.head=(q.head+1)%Max;
return key;
}

(5)演算法c代碼實現擴展閱讀:

計算循環隊列的元素個數:(尾-頭+表長)%表長

隊列頭指針為來front,隊列尾指針為rear,隊列容量為M,則元素個數為|rear-front+M|%M,注意,這個自%是求余運算。

設f為隊頭,r為隊尾,m為隊長,a為元素個數,則1. f>r時,a=m+r-f; 2. f<=r時,a=r-f

『陸』 kruskal演算法實現 c代碼

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

/* 定義邊(x,y),權為w */
typedef struct
{
int x, y;
int w;
}edge;

edge e[MAX];
/* rank[x]表示x的秩 */
int rank[MAX];
/* father[x]表示x的父節點 */
int father[MAX];
int sum;

/* 比較函數,按權值(相同則按x坐標)非降序排序 */
int cmp(const void *a, const void *b)
{
if ((*(edge *)a).w == (*(edge *)b).w)
{
return (*(edge *)a).x - (*(edge *)b).x;
}
return (*(edge *)a).w - (*(edge *)b).w;
}

/* 初始化集合 */
void Make_Set(int x)
{
father[x] = x;
rank[x] = 0;
}

/* 查找x元素所在的集合,回溯時壓縮路徑 */
int Find_Set(int x)
{
if (x != father[x])
{
father[x] = Find_Set(father[x]);
}
return father[x];
}

/* 合並x,y所在的集合 */
void Union(int x, int y, int w)
{

if (x == y) return;
/* 將秩較小的樹連接到秩較大的樹後 */
if (rank[x] > rank[y])
{
father[y] = x;
}
else
{
if (rank[x] == rank[y])
{
rank[y]++;
}
father[x] = y;
}
sum += w;
}

/* 主函數 */
int main()
{
int i, n;
int x, y;
char chx, chy;

/* 讀取邊的數目 */
scanf("%d", &n);
getchar();

/* 讀取邊信息並初始化集合 */
for (i = 0; i < n; i++)
{
scanf("%c %c %d", &chx, &chy, &e[i].w);
getchar();
e[i].x = chx - 'A';
e[i].y = chy - 'A';
Make_Set(i);
}

/* 將邊排序 */
qsort(e, n, sizeof(edge), cmp);

sum = 0;

for (i = 0; i < n; i++)
{
x = Find_Set(e[i].x);
y = Find_Set(e[i].y);
if (x != y)
{
printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w);
Union(x, y, e[i].w);
}
}

printf("Total:%d\n", sum);
//system("pause");
return 0;
}

『柒』 回溯演算法,用c語言實現

這個演算法應該不難,基本和全排列的演算法類似,只不過判斷條件不是n=1, 而是在判斷已經取得的數的和>=M為終止條件。

具體的演算法,我給個大概流程吧

int lst[N]; //保存選取的數
int index = 0; //lst中最後的一個數的位置

func(W, N)
{
if(N == 0) //遍歷完畢 返回
return;
for(i=0 to N)
{
if( W[i][1] != -1 ) //判斷是否已經讀取當前值
{
lst[index++] = W[i][0] //當前值加入到保存數組
W[i][1] = -1; //設置當前值已經讀取,不可再讀
if(check() == 0)
{
func(W, N-1); //大小不夠M,繼續往下讀
}
else if(check() == 1)
{
print(lst); //和為M,輸出
}
lst[--index] = 0; //回溯,尋找下一組解
W[i][1] = 0;
}
}
}

check()
{
if(sum(lst) > W)
return -1;

if(sum(lst) < W)
return 0;
return 1;
}

『捌』 請教MD5演算法 用C語言實現

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#ifdefined(__APPLE__)
#defineCOMMON_DIGEST_FOR_OPENSSL
#include<CommonCrypto/CommonDigest.h>
#defineSHA1CC_SHA1
#else
#include<openssl/md5.h>
#endif

//這是我自己寫的函數,用於計算MD5
//參數str:要轉換的字元串
//參數lengthL:字元串的長度可以用strlen(str)直接獲取參數str的長度
//返回值:MD5字元串
char*str2md5(constchar*str,intlength){
intn;
MD5_CTXc;
unsignedchardigest[16];
char*out=(char*)malloc(33);

MD5_Init(&c);

while(length>0){
if(length>512){
MD5_Update(&c,str,512);
}else{
MD5_Update(&c,str,length);
}
length-=512;
str+=512;
}

MD5_Final(digest,&c);

for(n=0;n<16;++n){
snprintf(&(out[n*2]),16*2,"%02x",(unsignedint)digest[n]);
}

returnout;
}

intmain(intargc,char**argv){
char*output=str2md5("hello",strlen("hello"));

printf("%s ",output);
//上面會輸出hello的MD5字元串:
//
free(output);
return0;
}

『玖』 怎樣用C語言實現FFT演算法啊

1、二維FFT相當於對行和列分別進行一維FFT運算。具體的實現辦法如下:
先對各行逐一進行一維FFT,然後再對變換後的新矩陣的各列逐一進行一維FFT。相應的偽代碼如下所示:
for (int i=0; i<M; i++)
FFT_1D(ROW[i],N);
for (int j=0; j<N; j++)
FFT_1D(COL[j],M);
其中,ROW[i]表示矩陣的第i行。注意這只是一個簡單的記法,並不能完全照抄。還需要通過一些語句來生成各行的數據。同理,COL[i]是對矩陣的第i列的一種簡單表示方法。
所以,關鍵是一維FFT演算法的實現。

2、常式:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#defineN1000
/*定義復數類型*/
typedefstruct{
doublereal;
doubleimg;
}complex;
complexx[N],*W;/*輸入序列,變換核*/
intsize_x=0;/*輸入序列的大小,在本程序中僅限2的次冪*/
doublePI;/*圓周率*/
voidfft();/*快速傅里葉變換*/
voidinitW();/*初始化變換核*/
voidchange();/*變址*/
voidadd(complex,complex,complex*);/*復數加法*/
voidmul(complex,complex,complex*);/*復數乘法*/
voidsub(complex,complex,complex*);/*復數減法*/
voidoutput();
intmain(){
inti;/*輸出結果*/
system("cls");
PI=atan(1)*4;
printf("Pleaseinputthesizeofx: ");
scanf("%d",&size_x);
printf("Pleaseinputthedatainx[N]: ");
for(i=0;i<size_x;i++)
scanf("%lf%lf",&x[i].real,&x[i].img);
initW();
fft();
output();
return0;
}
/*快速傅里葉變換*/
voidfft(){
inti=0,j=0,k=0,l=0;
complexup,down,proct;
change();
for(i=0;i<log(size_x)/log(2);i++){/*一級蝶形運算*/
l=1<<i;
for(j=0;j<size_x;j+=2*l){/*一組蝶形運算*/
for(k=0;k<l;k++){/*一個蝶形運算*/
mul(x[j+k+l],W[size_x*k/2/l],&proct);
add(x[j+k],proct,&up);
sub(x[j+k],proct,&down);
x[j+k]=up;
x[j+k+l]=down;
}
}
}
}
/*初始化變換核*/
voidinitW(){
inti;
W=(complex*)malloc(sizeof(complex)*size_x);
for(i=0;i<size_x;i++){
W[i].real=cos(2*PI/size_x*i);
W[i].img=-1*sin(2*PI/size_x*i);
}
}
/*變址計算,將x(n)碼位倒置*/
voidchange(){
complextemp;
unsignedshorti=0,j=0,k=0;
doublet;
for(i=0;i<size_x;i++){
k=i;j=0;
t=(log(size_x)/log(2));
while((t--)>0){
j=j<<1;
j|=(k&1);
k=k>>1;
}
if(j>i){
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
}
/*輸出傅里葉變換的結果*/
voidoutput(){
inti;
printf("Theresultareasfollows ");
for(i=0;i<size_x;i++){
printf("%.4f",x[i].real);
if(x[i].img>=0.0001)printf("+%.4fj ",x[i].img);
elseif(fabs(x[i].img)<0.0001)printf(" ");
elseprintf("%.4fj ",x[i].img);
}
}
voidadd(complexa,complexb,complex*c){
c->real=a.real+b.real;
c->img=a.img+b.img;
}
voidmul(complexa,complexb,complex*c){
c->real=a.real*b.real-a.img*b.img;
c->img=a.real*b.img+a.img*b.real;
}
voidsub(complexa,complexb,complex*c){
c->real=a.real-b.real;
c->img=a.img-b.img;
}
熱點內容
java靜態單例 發布:2025-08-16 23:34:52 瀏覽:326
平板拷貝如何緩存 發布:2025-08-16 23:19:05 瀏覽:599
繽越混動有哪些配置 發布:2025-08-16 23:17:57 瀏覽:247
刪除linux文件後 發布:2025-08-16 23:09:04 瀏覽:648
采訪時的采訪問題 發布:2025-08-16 23:07:27 瀏覽:110
電腦客戶端登錄伺服器怎麼清除 發布:2025-08-16 22:55:46 瀏覽:525
壓縮小木條 發布:2025-08-16 22:55:41 瀏覽:20
存款利率演算法 發布:2025-08-16 22:48:44 瀏覽:588
php開發api介面 發布:2025-08-16 22:47:48 瀏覽:839
將ssd轉化為hdd的高速緩存 發布:2025-08-16 22:39:04 瀏覽:910