zoukankan      html  css  js  c++  java
  • 求最大公约数的几种方法

    不多说,直接粘程序:

       1:  #include "stdafx.h"
       2:  #include <iostream>
       3:  using namespace  std;
       4:  #include<time.h>  
       5:  #include<math.h>
       6:  const int Max = 10;
       7:  //采用连续整数检测   ,   利用求最大公约数的性质解题,有点意思。
       8:  void gcd1(int a, int b)
       9:  {
      10:      int t;
      11:      int count = 0;
      12:      t = b;
      13:      while(1)
      14:      
      15:      {
      16:          count++;
      17:          if (a%t == 0)
      18:        {
      19:            if (b%t==0)
      20:            {
      21:                break;
      22:            }
      23:            else
      24:            {
      25:              t = t - 1;
      26:            }
      27:         }
      28:         else
      29:         {
      30:              t = t - 1;
      31:         }
      32:      }
      33:      cout << "采用连续整数检测算法输出的结果是:"<< endl;
      34:      cout << "输出最大公约数是:"<< t << endl;
      35:      cout << "最大迭代次数是:"<< count << endl;
      36:      
      37:  }
      38:   
      39:  //采用欧几里得算法   ,   又叫辗转相除算法
      40:  void gcd2(int a, int b)
      41:  {
      42:     int r = a % b;
      43:     int count = 0;
      44:     while(r != 0)
      45:     {
      46:         count++;
      47:         a = b;
      48:         b = r;
      49:         r = a % b;
      50:     }
      51:     cout << "采用欧几里得算法输出的结果是:"<< endl;
      52:     cout << "输出最大公约数是:"<< b << endl;
      53:     cout << "最大迭代次数是:"<< count << endl;
      54:  }
      55:   
      56:  //采用分解质因数法
      57:  void gcd3(int a, int b)
      58:  {
      59:     int x[Max]={0},y[Max]={0},z[Max]={0};
      60:     int count1 = 0, count2 = 0, count3 = 0, count = 0;
      61:     // 将a分解质因数,并将质因数放入x数组中
      62:     for (int i = 2; i<=a/2; i++)//从2一直往下试
      63:     {
      64:         count++;
      65:         while(a != i )
      66:         {
      67:             if (a%i == 0)
      68:             {
      69:                 a = a / i;
      70:                 x[count1] = i;
      71:                 count1++;
      72:                 count++;
      73:             }
      74:             else
      75:             {
      76:                 break;
      77:                 count++;
      78:             }
      79:         }
      80:     }
      81:     x[count1] = a;
      82:   // 将b分解质因数,并将质因数放入y数组中
      83:     for (int i = 2; i<=b/2; i++)//从2一直往下试
      84:     {
      85:          count++;
      86:         while(b != i )
      87:         {
      88:             if (b%i == 0)
      89:             {
      90:                 b = b / i;
      91:                 y[count2] = i;
      92:                 count2++;
      93:                  count++;
      94:             }
      95:             else
      96:             {
      97:                 break;
      98:             }
      99:         }
     100:     }
     101:     y[count2] = b;
     102:     int key = 0;
     103:     //在两个数组中寻找相同的元素的算法中,采取控制变量法,保持一个数组不变,用
     104:     //另一个数组中的每一个值与第二个数组中的值一个个比较,相同的保存到z中。
     105:    for (int m=0; m <= count1; m++)
     106:    {
     107:        key = x[m];
     108:         count++;
     109:        for (int n=0; n <= count2; n++)
     110:        {
     111:            if (key==y[n])
     112:            {
     113:                 count++;             
     114:                z[count3] = key;
     115:                count3++; 
     116:                break;
     117:            }
     118:        }
     119:    }
     120:    int max = 1;
     121:    for (int j = 0; j < count3; j++) //这里不要用 <= 不然,会出错。上面的count最后的数字有具体的值,此数组中对应的数据为0 
     122:    {
     123:        max = max * z[j];
     124:        count++;
     125:    }
     126:    cout << "采用分解质因数算法输出的结果是:"<< endl;
     127:    cout << "输出最大公约数是:"<< max << endl;
     128:    cout << "最大迭代次数是:"<< count << endl;
     129:  }
     130:   
     131:   
     132:  int main()
     133:  {
     134:      while(1)
     135:  {
     136:      clock_t start,stop;
     137:      int a,b;
     138:      cout << "请输入所要求最大公约数的两个数值:" <<endl;
     139:      scanf("%d,%d",&a,&b);
     140:      if (a < b)
     141:      {
     142:         int temp = a;
     143:         a = b;
     144:         b = temp;
     145:      }
     146:      start = clock();
     147:      gcd1(a,b);
     148:      stop = clock();
     149:      cout << "执行时间是:"<< stop - start << endl;
     150:   
     151:      start = clock();
     152:      gcd2(a,b);
     153:      stop = clock();
     154:      cout << "执行时间是:"<< stop - start << endl;
     155:   
     156:      start = clock();
     157:      gcd3(a,b);
     158:      stop = clock();
     159:      cout << "执行时间是:"<< stop - start << endl;
     160:  }
     161:      return 0;
     162:  }

    实验结果:

    clip_image002

    clip_image004

    实验总结:

    方法一当中,根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出On=n/2;

    方法二当中,根据代码辗转相除得到欧几里得的O(n)= log n

    方法三当中,根据代码分解质因子算法O(n)=n2+n/2

    但从我的实验结果来看,从时间复杂度来看,欧几里得算法的是最优算法,分解质因数算法其次,最后是连续整除法。从执行次数来看,欧几里得算法的是最优算法,连续整除法其次,最多的是分解质因数算法。再从代码运行的计数器和计算的时间来看,从执行次数上来分析,与理论分析结果一致,但从时间复杂度来看,结果不太一致。但我们可以得出结论的是:欧几里得算法最优。

     

  • 相关阅读:
    需求获取过程中的逆向沟通
    程序员==生 涯 篇
    算法设计
    灯的启示:微软对唐骏的面试题
    使用Gzip压缩提升WEB服务器性能
    简历误区
    招聘编辑的七道面试题
    web2.0及其相关技术
    经典面试题助你成功就业
    逗号网站推广营销策略
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3596829.html
Copyright © 2011-2022 走看看