求两个正整数的最大公约数GCD

1.目的: 从键盘输入两个数,输出两个正整数的最大公约数,用c语言实现。
2.算法设计思路: GCD常见算法有辗转相除法,更相减损术法,穷举法,Stein算法,本次采用3种方法,进行代码的实现。
(1)辗转相除法
两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数,结束
③ 若c≠0,则a=b,b=c,再回去执行①
(2)更相减损术法
两整数a和b:
① 若a>b,则a=a-b
② 若a③ 若a=b,则a(或b)即为两数的最大公约数,结束
④ 若a≠b,则再回去执行①
(3)穷举法:
① i= a b中的小数
② 若a,b能同时被i整除,则i即为最大公约数,结束
③ i–,再回去执行②
3.流程图:

求两个正整数的最大公约数GCD_第1张图片

4.代码如下:

//*********求最大公约数问题***********
//作者:刘婉
//版本:v1.0
//创建时间:2017年3月16日
//主要功能:求两个正整数的最大公约数
//
//************************************
#include
int main()
{

    int Euclidean (int x,int y);  //对Euclidean函数的声明
    int Minue(int g,int h);        //对Minue函数的声明
    int Example(int a,int b);      //对Example函数的声明
    int A,B,C;
    int d=1;
    while(d==1)
    {   
      printf("请输入两个正整数:");
      scanf("%d,%d",&A,&B);
      if(A<0||B<0)
      {
        printf("输入错误,请退出(注意应输入两个正整数)");
        return 0;
      }
      C=Euclidean(A,B); //调用Euclidean函数,有两个实参,最大公约数赋给变量C
      C=Minue(A,B);                     //调用Minue函数
      C=Example(A,B);                   //调用Example函数
      printf("利用辗转相除法求得这两个正整数的最大公约数为:%d\n",C);
      printf("利用更相减损术法求得这两个正整数的最大公约数为:%d\n",C);
      printf("利用穷举法法求得这两个正整数的最大公约数为:%d\n",C);
      printf("1.继续查询 2.退出\n");
      scanf("%d",&d);
    }
    return 0;
}
//利用辗转相除法求最大公约数
int Euclidean(int x,int y)              //定义Euclidean函数
{
    int r;
    if(x>y)
        while(r!=0)
        {
            r=x%y;
            x=y;
            y=r;
            return y;
        }

    else
        while(r!=0)
        {
            r=y%x;
            y=x;
            x=r;
        }
        return x;
}

//利用更相减损术求最大公约数
int Minue(int g,int h)                   //定义Minue函数
{
    int i,j,q;
    if(g%2==0&&h%2==0)
    {
        i=g/2;
        j=h/2;
        while(i!=j)
        {
            if(i>j)
                i-=j;
            else
                j-=i;
        }
        q=2*i;
        return q;
    }
    else
        while(g!=h)
        {
            if(g>h)
                g-=h;
            else
                h-=g;
        }
        return g;
}
//利用穷举法求最大公约数
int Example(int a,int b)                  //定义Example函数
{
    int z,w;
    if(a>b)
    {
        z=b;
        while(a%z!=0&&b%z!=0)
            z--;
        return z;
    }
    else
    {
        w=a;
        while(a%w!=0&&b%w!=0)
            w--;
        return w;
    }
}

5.运行结果:

求两个正整数的最大公约数GCD_第2张图片
6.调试:
(1)返回值的位置放错导致代码错误

求两个正整数的最大公约数GCD_第3张图片

这里为错误提示

错误提示

下面为正确代码

求两个正整数的最大公约数GCD_第4张图片

(2)由于赋值的错误,导致代码出现错误

求两个正整数的最大公约数GCD_第5张图片

这里为错误提示

错误提示

下面为正确代码

求两个正整数的最大公约数GCD_第6张图片

7.测试
(1)加入数据的持续性输入,在验证数据输入错误将重新输入时重复出错。
以下为按顺序修改的代码:
【1】

求两个正整数的最大公约数GCD_第7张图片

【2】

求两个正整数的最大公约数GCD_第8张图片

【3】

求两个正整数的最大公约数GCD_第9张图片
在我的电脑上无法正常运行,在输入错误时,无法继续输入数字

求两个正整数的最大公约数GCD_第10张图片

但是在同学的电脑里可以

求两个正整数的最大公约数GCD_第11张图片

这个问题很让人苦恼,还望高人指教
(2)编写持续性输入的代码时,由于循环位置没有放正确,导致运行结果,为无线循环,后来经过摸索,改正确。

求两个正整数的最大公约数GCD_第12张图片

8.个人总结:
这次探讨的问题是求两个正整数的最大公约数,传统有四种方法,我的程序里用了其中三种,用c语言调用三个函数计算两个正整数的最大公约数,对于个人来说,这个程序属于c语言中的基础,但再基础的代码在编写时,总会遇到一些意想不到的问题,比如,当用户错误输入时,我代码里希望用户在看到提示时仍可以继续输入,直到输入正确,进行计算。但事实上,经过我多次调试,最后得到最好的结果是在我本人的电脑仍无法达到预期运行结果,但在同学的电脑上可以,我个人资历尚浅,还不太了解这类问题(或者兼容性),目前无奈只能彻底改动此处代码,但我本人仍会继续查资料,直到将这个问题解决,之后我会上传博客。编程说难也难,还需继续努力。

你可能感兴趣的:(求两个正整数的最大公约数GCD)