HDU-1014魔鬼在细节中

9 篇文章 0 订阅
8 篇文章 0 订阅

此题原本觉得很水,刷的时候一遍又一遍的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等等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值