for(z=0; z<10000000; z++) 迴圈只是為了增加程式的執行時間,讓我們體會演算法的時間複雜度。
演算法一:短除法
想法,採用短除法找出2個數的所有公約數,將這些公因子相乘,結果就是2個數的最大公約數。【找公因子,只能使用蠻力法】
#include
#include
void main()
int m=28,n=72;
int i,f=1;
int z;
clock_t start,finish;
double duration;
start= clock();
for(z=0; z<10000000; z++)
for(i=2;i<=m&&i<=n;)
while(m%i==0&&n%i==0)
f*=i;
m/=i;
n/=i;
i++;
finish=clock();
duration=(double)(finish-start)/clocks_per_sec;
printf("time=%lf seconds\n",duration);
printf("result=%d\n",f);
image.png
演算法二:輾轉相除法
輾轉相除法, 又名歐幾里德演算法(euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。
#include
#include
void main()
int m=28,n=72;
int i,f=1;
int z;
clock_t start,finish;
double duration;
start= clock();
for(z=0; z<10000000; z++)
if(m
i=m;
m=n;
n=i;
i=m%n;
while(i)
m=n;
n=i;
i=m%n;
f=n;
finish=clock();
duration=(double)(finish-start)/clocks_per_sec;
printf("time=%lf seconds\n",duration);
printf("result=%d\n",f);
time=0.037000 seconds
result=4
press any key to continue
演算法三:蠻力法,從2個公約數中較小的數開始遞減,二個公約數除以它,可以同時除盡,變是最大公約數,我想的,很笨的一種。
#include
#include
void main()
int m=28,n=72;
int i,f=1;
int z;
clock_t start,finish;
double duration;
start= clock();
for(z=0; z<10000000; z++)
f=m>n?n:m;
for(i=f;i>0;i--)
if(m%i==0&&n%i==0)
f=i;
break;
finish=clock();
duration=(double)(finish-start)/clocks_per_sec;
printf("time=%lf seconds\n",duration);
printf("result=%d\n",f);
time=0.992000 seconds
result=4
press any key to continue
演算法四:輾轉相減法
輾轉相減法是一種簡便的求出兩數最大公約數的方法。(更相減損術)輾轉相減法(求最大公約數),即尼考曼徹斯法,其特色是做一系列減法,從而求得最大公約數。例如 :兩個自然數35和14,用大數減去小數,(35,14)->(21,14)->(7,14),此時,7小於14,要做一次交換,把14作為被減數,即(14,7)->(7,7),再做一次相減,結果為0,這樣也就求出了最大公約數7
#include
#include
void exchange(int *m,int *n);
void main()
int m=28,n=72;
int i,f=1;
int z;
clock_t start,finish;
double duration;
start= clock();
if(m
exchange(&m,&n);
for(z=0; z<10000000; z++)
i=m-n;
while(i)
if(i>n)
m=i;
}else
m=n;
n=i;
i=m-n;
f=m;
finish=clock();
duration=(double)(finish-start)/clocks_per_sec;
printf("time=%lf seconds\n",duration);
printf("result=%d\n",f);
void exchange(int *m,int *n)
int temp;
temp=*m;
*m=*n;
*n=temp;
time=0.020000 seconds
result=4
press any key to continue
看看4個演算法的執行時間,還是我自己想的演算法時間最久,來乙個
大神拯救我吧。
最大公約數簡便演算法 最大公約數演算法
1 查詢約數法 先分別找出每個數的所有約數,再從兩個數的約數中找出公有的約數,其中最大的乙個就是 最大公約數 例如,求 12 和 30 的最大公約數 12 的約數有 1 2 3 4 6 12 30 的約數有 1 2 3 5 6 10 15 30 12 和 30 的公約數有 1 2 3 6,其中 6 ...
求最大公約數
最新用了三種演算法實現了求最大公約數的演算法,用的c 寫的,最大公約數也是我們生活中常見的問題 1 窮舉法 主要 如下 if a b for i 1 i a i 演算法分析 窮舉法先將a,b兩值比較大小並且互換,再進行與各種數的整除,如果這個數能同時被a,b整除,那麼這個數就為最大公約數,這種演算法...
求最大公約數
暴力列舉法很簡單,從較小整數的一班開始,試圖找到乙個合適的整數i,檢查這個整數i是否被a和b同時整除 暴力列舉法求最大公約數 param a param b return public static int getgreatestcommondivisor v1 int a,int b for in...