*********************************************************************************
创新互联凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、成都网站设计、成都做网站、网站优化、软件开发、网站改版等服务,在成都十载的网站建设设计经验,为成都近千家中小型企业策划设计了网站。导言:本人也是一位小白,有错误的地方请各位大佬指出,我便修改,这是我的第一篇博客写得不好请见谅。
下面介绍两种方法->
*********************************************************************************
代码如下:
#include#include//system("pause");的头文件
int main ()
{
int i = 0, j = 0;
int temp = 0;
printf("请输入两个正整数:>");
scanf("%d,%d",&i,&j);
if(i >j)
{
temp = j;
}
else
{
temp = i;
}
for(temp; temp>0; temp--)
{
if(((i % temp) == 0) && ((j % temp) ==0))
{
printf("大公约数是:%d\n",temp);
break;
}
}
system("pause");//卡住生成的窗口方便观察结果
return 0;
}
此方法的原理:将输入的两个数中较小的一个数给到一个中间变量用作for循环,以此来自减,在减的过程中会把这个数拿给输入时的两个数进行取余运算,若输入时的数均取余得到0就说明此时的中间变量的值就是输入的两个数的大公约数。(因为较小的那个数自减的话比较大的那个数提高了效率,大公约数顾名思义是输入两个正整数均所能整除的大数)
当然这样的代码很是繁琐,看起来一大堆,所以为大家准备了第二种方法。
第二种方法也是大家上学时学过的“欧几里得算法”也就是辗转相除法,这属于算法的一种了。
先解释一下原理吧:
辗转相除法原理:先输入a和b进行取余(a%b,不管先后顺序),若为0则说明a和b的大公约数为b;若不为0则继续把b的值赋值给a,把前面取余得到的数赋值给b,然后继续取余判断a和b(a%b,不管先后顺序)是否等于0,若为0则说明大公约数就是b的值,若不为0则继续把b的值赋值给a,把前面取余的数赋值给b,然后继续判断a和b取余(a%b,不管先后顺序)看是否等于0,如此循环。直到a%b==0了就说明b为a与b之间的大公约数。
前面说到”减一法“的代码比较繁琐而这里却更繁琐,这里时为了大家更好的理解,下面会有优化的代码的,请各位看官稍安勿躁哦!
代码如下:
#include#include//system("pause");的头文件
int main ()
{
int i = 0, j = 0;
int min = 0;
int max =0;
printf("请输入两个正整数:>");
scanf("%d,%d",&i,&j);
if(i >j)
{
min = j;
max = i;
}
else
{
min = i;
max = j;
}
while(1)
{
if((max % min) == 0)
{
printf("大公约数是:>%d\n",min);
break;
}
else
{
int num = min;
min = max % min;
max = num;
}
}
system("pause");//卡住生成的窗口方便观察结果
return 0;
}
注意:辗转相除法不需要把更大的数放前面,因为该方法具备“自动”把大的数换到前面去。
既然说到了可以不论顺序,所以我们吧这算法优化一下
#include#include//system("pause");的头文件
int main ()
{
int i = 0, j = 0;
int num =0;
printf("请输入两个正整数:>");
scanf("%d,%d",&i,&j);
while(num=(i%j))
{
i = j;
j = num;
}
printf("大公约数是:%d\n",j);
system("pause");//卡住生成的窗口方便观察结果
return 0;
}
这里就很简洁啦,相信大家也理解得差不多了吧!!!
我把代码运行输出一下吧!
最后希望大家指出我的问题!
谢谢各位看官的光临,点点赞吧!!!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧