1. 程式人生 > >C程式-藍橋-核桃的數量

C程式-藍橋-核桃的數量

問題描述

小張是軟體專案經理,他帶領3個開發組。工期緊,今天都在加班呢。為鼓舞士氣,小張打算給每個組發一袋核桃(據傳言能補腦)。他的要求是:

1. 各組的核桃數量必須相同

2. 各組內必須能平分核桃(當然是不能打碎的)

3. 儘量提供滿足1,2條件的最小數量(節約鬧革命嘛)

輸入格式

輸入包含三個正整數a, b, c,表示每個組正在加班的人數,用空格分開(a,b,c<30)

輸出格式

輸出一個正整數,表示每袋核桃的數量。

樣例輸入1

2 4 5

樣例輸出1

20

樣例輸入2

3 1 1

樣例輸出2

3

 

思路:求出三個數的最小公倍數,輾轉相除法求最大公約數

在數學中,輾轉相除法,又稱歐幾里得演算法(英語:Euclidean algorithm),是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。

兩個整數的最大公約數是能夠同時整除它們的最大的正整數。輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。例如,252和105的最大公約數是21(252 = 21 × 12;105 = 21 × 5);因為252 − 105 = 21 × (12 − 5) = 147,所以147和105的最大公約數也是21。在這個過程中,較大的數縮小了,所以繼續進行同樣的計算可以不斷縮小這兩個數直至其中一個變成零。這時,所剩下的還沒有變成零的數就是兩數的最大公約數。由輾轉相除法也可以推出,兩數的最大公約數可以用兩數的整數倍相加來表示,如21 = 5 × 105 + (−2) × 252。這個重要的結論叫做

裴蜀定理

輾轉相除法最早出現在歐幾里得的《幾何原本》中(大約公元前300年),所以它是現行的演算法中歷史最悠久的。這個演算法原先只用來處理自然數和幾何長度(相當於正實數),但在19世紀,輾轉相除法被推廣至其他型別的數學物件,如高斯整數和一元多項式。由此,引申出歐幾里得整環等等的一些現代抽象代數概念。後來,輾轉相除法又擴充套件至其他數學領域,如紐結理論多元多項式

輾轉相除法有很多應用,它甚至可以用來生成全世界不同文化中的傳統音樂節奏。在現代密碼學方面,它是RSA演算法(一種在電子商務中廣泛使用的公鑰加密演算法)的重要部分。它還被用來解丟番圖方程,比如尋找滿足中國剩餘定理的數,或者求有限域

中元素的逆。輾轉相除法還可以用來構造連分數,在施圖姆定理和一些整數分解演算法中也有應用。輾轉相除法是現代數論中的基本工具。

輾轉相除法處理大數時非常高效,如果用除法而不是減法實現,它需要的步驟不會超過較小數的位數(十進位制下)的五倍。拉梅於1844年證明了這點,同時這也標誌著計算複雜性理論的開端。

 

#include <stdio.h>

int mysort(int n1,int n2)
{
    int a=n1,b=n2;
    int temp;
    
    if(a > b)//比較大小 
    {
        temp = a;
        a = b;
        b = temp;
    }
    
    while(a!=0)//輾轉相除法求最大公約數 
    {
        temp = b % a;
        b = a;
        a = temp;
    }
    
    return n1*n2/b;//兩數積除以最大公約數及最小公倍數 
}

int main( ) 
{
    int num[3];
    int i;
    for(i=0;i<3;i++)
        scanf("%d",&num[i]);//接收三個數 
    int a = mysort(num[0],num[1]);//先求其中兩個數的公倍數 
    int b = mysort(a,num[2]);//將上述結果繼續與剩下一個數求公倍數 
    printf("%d",b);
//    printf("a= %d,b = %d",a,b);
    return 0;
}