最大公约数简便算法_求最大公约数的4种算法
for(z=0; z<10000000; z++) 循環(huán)只是為了增加程序的運行時間,
讓我們體會算法的時間復雜度。
算法一:短除法
想法,采用短除法找出2個數(shù)的所有公約數(shù),將這些公因子相乘,結果就是2個數(shù)的最大公約數(shù)。【找公因子,只能使用蠻力法】
#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);
}
算法二:輾轉相除法
輾轉相除法, 又名歐幾里德算法(Euclidean algorithm),是求最大公約數(shù)的一種方法。它的具體做法是:用較小數(shù)除較大數(shù),再用出現(xiàn)的余數(shù)(第一余數(shù))去除除數(shù),再用出現(xiàn)的余數(shù)(第二余數(shù))去除第一余數(shù),如此反復,直到最后余數(shù)是0為止。如果是求兩個數(shù)的最大公約數(shù),那么最后的除數(shù)就是這兩個數(shù)的最大公約數(shù)。
#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個公約數(shù)中較小的數(shù)開始遞減,二個公約數(shù)除以它,可以同時除盡,變是最大公約數(shù),我想的,很笨的一種。
#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
算法四:輾轉相減法
輾轉相減法是一種簡便的求出兩數(shù)最大公約數(shù)的方法。(更相減損術)輾轉相減法(求最大公約數(shù)),即尼考曼徹斯法,其特色是做一系列減法,從而求得最大公約數(shù)。例如 :兩個自然數(shù)35和14,用大數(shù)減去小數(shù),(35,14)->(21,14)->(7,14),此時,7小于14,要做一次交換,把14作為被減數(shù),即(14,7)->(7,7),再做一次相減,結果為0,這樣也就求出了最大公約數(shù)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個算法的運行時間,還是我自己想的算法時間最久,來一個
大神拯救我吧。
總結
以上是生活随笔為你收集整理的最大公约数简便算法_求最大公约数的4种算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python判断奇偶数字符串的拼接_Py
- 下一篇: java arraylist 常用方法_