輾轉相除法 氣泡排序

xhbyao發表於2018-10-30

Problem G: 輾轉相除法

Time Limit: 1 Sec Memory Limit: 2 MB

Description

輾轉相除法,也稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
兩個整數的最大公約數(亦稱公約數)是能夠同時整除它們的最大的正整數。輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。例如,252和105的最大公約數是21(252 = 21 × 12;105 = 21 × 5);因為252 − 105 = 147,所以147和105的最大公約數也是21。在這個過程中,較大的數縮小了,所以繼續進行同樣的計算可以不斷縮小這兩個數直至其中一個變成零。這時,所剩下的還沒有變成零的數就是兩數的最大公約數。
例如,計算a = 1071和b = 462的最大公約數的過程如下:從1071中不斷減去462直到小於462(可以減2次,即商q0 = 2),餘數是147:
1071 = 2 × 462 + 147.
然後從462中不斷減去147直到小於147(可以減3次,即q1 = 3),餘數是21:
462 = 3 × 147 + 21.
再從147中不斷減去21直到小於21(可以減7次,即q2 = 7),沒有餘數:
147 = 7 × 21 + 0.
此時,餘數是0,所以1071和462的最大公約數是21。

Input

輸入為多行,每行有一對非負整數a,b,且a*b不會超出int型別的資料範圍。輸入至EOF結束。

Output

每行輸出一對a,b的最大公約數和最小公倍數,順序與輸入對應。

從整除定義出發:若a整除b(b除以a沒有餘數),則b是a的倍數,a是b的約數,這裡要求b不為0。因此0是任意整數的倍數(任意整數都是0的約數),但是0不能是約數。

Sample Input

1 1
2 3
2 2
3 2
4 6
7 5
12 6
18 9
24 36

Sample Output

1 1
1 6
2 2
1 6
2 12
1 35
6 12
9 18
12 72
HINT
按照題目描述所給的演算法解題,注意以下幾點:輾轉相除法對兩個數的大小關係有要求,根據倍數和約數的數學定義,一個非0數和0的約數是多少?輾轉相除法的計算過程是符合這種定義的。

#include<stdio.h>
int main()
{
    int a,b,c,i,j,k,temp;
    while(scanf("%d %d", &a, &b)!=EOF)
    {
        if(a<b)//a,b按大小排序
        {
            temp=a;
            a=b;
            b=temp;
        }
        c=a*b;//a*b=最大公約數*最小公倍數
        while(b!=0)//輾轉相除法 a/b=c....d a=b b=d(b!=0)
        {
            temp=a%b;
            a=b;
            b=temp;
        }
        printf("%d %d\n",a,c/a);
    }
    return 0;
}

#include<stdio.h>
int main()
{
    int i,j,k,m,n,temp;
    int a[1010];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n-i-1;j++)//每次將最大數放在最後
            if(a[j]>a[j+1])//而且由於j+1 因此最後i+1個不用遍歷
            {              
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(i==0) printf("%d",a[i]);
        else printf(" %d",a[i]);
    }

    return 0;
}

相關文章