樸素演算法:不詳細講了,就是先算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...
演算法分析與設計 分治演算法
在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅...