此题原本觉得很水,刷的时候一遍又一遍的WA快让我抓狂了..先看下网上的几段代码:
求最大公约数的函数(证明从略--实际上我也不知道囧)
1.递归
int gcd(int a,int b)
{
if(a==0)
{
return b;
}else
{
return gcd(b % a,a);
}
}
2.考虑到大小不一致的情况封装函数:
int mcd(int a, int b)
{
if( a <= 0 || b <= 0 )
return -1;
int max,min;
max = a > b ? a : b;
min = a + b - max;
int temp;
//辗转相除
while( min )
{ temp = min;
min = max % min;
max = temp;
}
return max; }
3.接下来有一种更精简的代码:
int get_comm_div(int m,int n)
{
int tmp;
while(m%n)
{
tmp=m%n;
m=n;
n=tmp;
}
return tmp;
}
问题就出在第三种上面..本来想直接水过去的..结果不断AC
对比一下AC的代码和自己的:
AC:
#include<stdio.h>
int main()
{
int a,b;
int gcd(int a,int b);
while(scanf("%d%d",&a,&b)!=EOF)
{
if(gcd(a,b)!=1)
printf("%10d%10d Bad Choice\n\n",a,b);
else
printf("%10d%10d Good Choice\n\n",a,b);
}
}
int gcd(int a,int b)
{
int t;
while(b>0)
{
t=a%b;
a=b;
b=t;
}
return (a);
}
自己的:
#include <stdio.h>
/*
Author:Unibrighter
Version 2012-8-16 17:09:13
Problem ID:HDU-1014
Tip:Transform this problem into another,which requires to get the Greatest Common Divice(GCD)
*/
//Remember to review the Format methods of IO
int main()
{
//freopen(".\\1014in.txt","r",stdin);
int STEP,MOD,GCD;
while(scanf("%d %d",&STEP,&MOD)!=EOF)
{
GCD=0;//refresh the value of GCD
printf("%10d%10d ",STEP,MOD);//Show the input Statics
while(STEP%MOD)
{
GCD=STEP%MOD;
STEP=MOD;
MOD=GCD;
}
//printf("MOD:%d ;STEP:%d ;GCD:%d ",MOD,STEP,GCD);
if(GCD==1||(STEP==MOD&&STEP==1))//如果这里是GCD==1,就会WA
printf("Good Choice\n\n");
else
printf("Bad Choice\n\n");
}
return 0;
}
那么我们看看,这两个循环究竟有什么区别呢.在技术宅的讨论群里 天人大大给出了答案,原文摘录如下:
天人 0:16:15
大大..帮偶看看这两个循环有什么区别好米>.<...
研究了一下午了,就因为这一个循环而不能AC.
前提:(1<=a,b<=100000)
例子:
5 3
5和3的最小公约数肯定是1。
把它们当作要求的最大公约数的倍数。
当它们互相求余求到对方掉裤子变成1的时候,出来的数就是要求的最大公约数。
(仅以“倍数”进行说明)因此在其中一方为1的时候,必然出现整除,t为0时,b必为1。b实际的值就为所求的最大公约数。
1、以b>0为判断条件,等同于b为0时退出循环。则此前b=0,有t=0,所以最大公约数落在a上(或再上一次的b,可惜已死)。
2、以a%b为判断条件,等同于当b为1时退出循环,则此前b=1,t=1,所以最大公约数落在b或者t。
总体上,方法1比方法2运算多一次。/这就是重点
当a=b=1时,方法2不进去循环内,因此t无值,参数需要修改为b。
int t,a,b;
while(b>0)
{
t=a%b;
a=b;
b=t;
}
return (a);
2. int t,a,b;
while(a%b)
{
t=a%b;
a=b;
b=t;
}
return t;//参数改为b才正确
我用了很多组测试数据,除了a==b==1的情况已经考虑进去了以外,其他的所有情况都是一样的啊..没有觉得有区别啊 啊啊啊啊..
以上问题解决,感谢技术宅纯技术研究所群里的朋友,尤其是EricHo和天人,xushine等等.