输入两个正整数,求他们的最大公约数。
第一次写的程序如下,但完全是个错误。
#include<stdio.h>
int gcd(int x,int y);//gcd函数
int min(int x,int y);//最小值函数
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=gcd(a,b);
printf("%d\n",c);
}
int min(int x,int y)
{
int min;
min=x;
if(y<min)
min=y;
return min;
}//求出输入的两个数中的最小值
int gcd(int a,int b)
{
int i,j,k,n,sum=1,h;
i=min(a,b);
if(a==i)
j=b%i;
else
j=a%i;
if(j==0)
return i;
//检验是否存在最大公约数等于a,b其中一个
else{
h=a%b;
if(h!=0)
return 1;//检验最大公因数是否为1
for(k=2;j!=0;k++){
n=i%k;
if(n==0){
i=i/k;j=b/i;
sum*=k;
}
return sum;
}//用输入的两个数中最小值,看看2是否是它的
}
}
我的思路是:求出a,b中较小值,然后将较小值从高往低除,直到发现他们的最大公约数为止。可是在第一版的代码里面出现了许许多多的bug和想法错误,导致没有成功。
终于在下午体测完之后,脑子稍微清醒一点点,然后改正成为了如下代码。
原谅我狂放不羁的变量名和胡乱一样的语句。
#include<stdio.h>
int gcd(int x,int y);
int min(int x,int y);
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=gcd(a,b);
printf("%d\n",c);
}
int min(int x,int y)
{
int min;
min=x;
if(y<min)
min=y;
return min;
}//最小值函数,求出ab中最小值者
int gcd(int a,int b)
{
int i,j,k=2,n,sum=1,h,l=1,c;
i=min(a,b);
if(a==i){
j=b%i;c=b;
}
else{
j=a%i;
c=a;
} //判断是否出现ab最大公因数是ab其中一个,同时借用这个判断结构,找出ab中最大值,成功实现ab大小值分离。
if(j==0)
return i;
//检验是否存在最大公约数等于a,b其中一个
else{
for(k=2;j!=0;k++){
n=i%k;
if(n==0){
l=i/k;j=c%l;
}
sum=l;
}//这里的代码有点问题,但是最后感觉还是能做出来,我尽量去解释一下:注意区分整除(1)和整除(2)
//让k从2开始,用ab较小值模k,然后判断是否整除,如果整除(1),将ab较小值除k,并赋值给l,然后较大值模l,判断是否整除(2),整除的话结束循环,输出l
//如果没有整除(2)则继续循环,知道找到最大公因数为止。
//如果整除(1)没有整除,j初始值为1,继续循环,知道找到整除为止。如果最后还是没有整除(1),那么此时k会取到ab中较小值
//l会等于1,j会等于0,结束循环,返回1为最大公约数。
return sum;
}
}
对于新人来说,独立想出这一段代码真的挺好费时间的(我觉得最后两个整除判断是真的妙(狗头)),肯定有更棒的解决方法,希望有大佬看到这段不成熟的代码可以给我一些指导建议hhh
谢谢各位能看我的垃圾废话看到这里!爱您!
绝了,今天上课看了老师做的gcd,深感自己的数学实在是不行哈哈哈。
明明求最大公因数在数学上用辗转相除最快啊wwww…
#include<stdio.h>
int main()
{
int r,p,q;
scanf("%d%d",&p,&q);
r=p%q;//p是分母,q是分子
if(r==0)
printf("%d",q);
else
{
while(r!=0){
p=q;
q=r;
r=p%q;
}
printf("%d",q);
}
}