Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114651
  • 博文数量: 24
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-12 16:16
个人简介

努力做个顶好的程序匠

文章分类

全部博文(24)

文章存档

2013年(1)

2011年(2)

2010年(21)

我的朋友

分类: C/C++

2011-03-21 20:26:05


#include<stdio.h>
int main()
{
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        printf("%d\n",gcd(a,b));
        printf("%d\n",gcd1(a,b));
        printf("%d\n",gcd2(a,b));
        printf("%d\n",gcd3(a,b));
        printf("%d\n",lcm(a,b));
        printf("%d\n",lcm1(a,b));
    }
}
/* 直观算法,逐个试商枚举*/
int gcd(int a,int b)
{
    int i,t=1;
    int c=(a<=b)? a:b;
    for(i=2;i<=c;i++)
        if(a%i==0 && b%i==0)
            t=i;
    return t;
}
/* 模拟短除法*/
int gcd1(int a,int b)
{
    int i,t=1;
    int c=(a<=b)? a:b;
    for(i=2;i<=c;i++)
    {
        while(a%i==0 && b%i==0)
        {
            a=a/i;
            b=b/i;
            t*=i;
            c=(a<=b)? a:b;
        }
    }
    return t;
}
/* 根据欧几里德gcd(a,b)=gcd(b,a%b),辗转相除*/
int gcd2(int a,int b)
{
    int i,t=1,temp,c;
    if(a<b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    while(b)
    {
        c=a;
        a=b;
        b=c%b;
    }
    return a;
}

int gcd3(int a,int b)
{
    int c;
    c=a%b;
    while(c)
    {
        a=b;
        b=c;
        c=a%b;
    }
    return b;
}

int lcm(int a,int b)
{
    return (a*b)/gcd2(a,b);
}
/* 模拟短除法*/
int lcm1(int a,int b)
{
    int i,t=1,flag;
    int c=(a>=b)? a:b;
    for(i=2;i<=c;i++)
    {
        flag=1;
        while(flag)
        {
            flag=0;
            if(a%i==0)
            {
                a=a/i;
                flag=1;
            }
            if(b%i==0)
            {
                b=b/i;
                flag=1;
            }
            if(flag)
                t*=i;
        }
        c=(a>=b)? a:b;
    }
    return t;
}


阅读(2169) | 评论(0) | 转发(0) |
0

上一篇:二叉树遍历

下一篇:C++学习笔记

给主人留下些什么吧!~~