c 語言 樸素演算法與分治演算法計算X n

2021-08-20 23:05:32 字數 1680 閱讀 2877

樸素演算法:不詳細講了,就是先算x乘x,算完結果在乘x,直到n個x相乘

分治演算法(看圖比較方便)

如圖:演算法先將x^n分開,分到不能再分為止(分的時候是呼叫自身函式),程式執行時也是如此,當不能再分時開始和從下往上和,例如3^6,先算sum=3*3*3,再算sum=sum*sum(即sum=3^3*3^3)

樸素演算法與分治演算法計算x^n的演算法比較

#include

#include//strand,rand函式標頭檔案

#include//clock函式標頭檔案

doubleputong(int x,int n)//普通方法計算x^n

double time;//執行時間

clock_t beg,end;//起始時間,結束時間

beg=clock();                //普通方法起始時間

long long he=1;//儲存結果

int i;

for(i=1;i<=n;i++) //迴圈計算結果

he=he*x;

end=clock();//普通方法結束時間

time=(double)(end-beg) / clocks_per_sec; //普通方法執行時間

printf("%lld\n",he);

return time;

longlong erfen(int x, int n)//二分(分治)計算x^n

long long he;//儲存結果

if(n==1)

return (long long)x;//結束自身迴圈或n為1

else if(n > 1)

long long s;

int m=n/2;//分段

s=erfen(x,m);//呼叫本身函式(遞迴)

if(n%2==0)//n為偶次

he=s*s;//進行分段計算

return he;

else

he=s*s*x;//進行分段計算

return he;//n為奇次

intmain()

int x,n;

double time;//執行時間

printf("輸入x的值:");

scanf("%d",&x);

printf("輸入n的值:");

scanf("%d",&n);

clock_t beg,end;//起始時間和結束時間

printf("普通演算法執行時間為%f\n",putong(x,n));

beg=clock();//二分(分治)起始時間

long long sum=erfen(x,n);

end=clock();//二分(分治)結束時間

time=(double)(end- beg) / clocks_per_sec;// //二分(分治)執行時間

printf("二分演算法執行時間為%f\n",time);

KMP演算法與樸素模式匹配演算法(C語言)

include define ok 0 define error 1 define failed 1 int readfile char buffer fseek fp,0,seek set fseek fp,0,seek end length ftell fp buffer char malloc...

大數相乘(C語言,分治演算法)

問題 由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加 減 乘三種方法。下面就是用分治演算法解決 大數相乘 問題。分治演算法解題的一般步驟 include using namespa...

演算法分析與設計 分治演算法

在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅...