欧几里徳算法 减法与除法哪个更快-例题hdu1108

欧几里徳算法 减法与除法哪个更快-例题hdu1108

Problem Description

给定两个正整数,计算这两个数的最小公倍数。

 

 

Input

输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.

 

 

Output

对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

 

 

Sample Input

10 14

 

 

Sample Output

70

 

#include 
using namespace std;
int gcd(int x,int y)//除法版     欧几里徳算法:辗转相除法
{
    if(x < y) return gcd(y,x);
    if(y == 0) return x;
    return gcd(y,x%y);
}

/*int gcd(int x,int y)//减法版 反复用大数减小数,直到相等为止.
{
while(x != y)
{
if(x > y)x -= y;
else
y -= x;
}
return x;
}*/

int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        cout<


 

 

一个是递归求解,一个是循环求解

 

最小公倍数求法:
x*y/(gcd(x,y))  两数之积除以两数的最大公约数

 

但是两种方法分别提交都出现了以下情况,无法知道哪种方法效率更高?

减法版

 

 

除法版

 

 

 

所以我自己给出了一些数据,自己测试两种方法的效率

#include 
#include 
using namespace std;

int gcd(int x,int y)//减法版
{
    while(x != y)
    {
        if(x > y)x -= y;
        else
            y -= x;
    }
    return x;
}

/*int gcd(int x,int y)//除法版
{
if(x < y) return gcd(y,x);
if(y == 0) return x;
return gcd(y,x%y);
}*/

int main()

{
    int a,b;
    clock_t start,end;
    start = clock();
    for(a = 1;a < 100;a++)
    {
        for(b = 1;b < 100;b++)
            cout<


 

结果:

1、数据在1的情况下,除法版运行的时间为18145ms18853ms18472ms,减法版运行的时间为18753ms18692ms18897ms,平均下来是除法版的效率更高一些。

2、数据在a=10,10的情况下,除法版运行的时间为131ms148ms142ms,减法版运行的时间为151ms161ms142ms,平均下来是除法版的效率更高一些。

3、数据在a=10,9999900的情况下,除法版运行的时间为112ms110ms112ms,减法版运行的时间为349ms327ms360ms,平均下来是除法版的效率更高一些。

 

经过我个人不完全测试,发现除法版的gcd更胜一筹。也就是辗转相除法效率更高。

你可能感兴趣的:(ACM/,CPC)