1. 程式人生 > >C語言之函式呼叫07—求4個數的最大公約數和最小公倍數

C語言之函式呼叫07—求4個數的最大公約數和最小公倍數

//函式呼叫
/*
==========================================================
題目:求4個數的最大公約數和最小公倍數。
==========================================================
*/
#include<stdio.h>
long gys(long m,long n)
{
int t,r;
if(m<n)
{t=m;m=n;n=t;}
while((r=m%n)!=0)
{
m=n;n=r;
}
return (n);
}
long gys(long a,long b,long c)
{
long q;
q=gys(gys(a,b),c);
return(q);
}
long gys(long a,long b, long c,long d)
{
long q;
q=gys(gys(a,b,c),d);
return (q);
}
long gbs(long a,long b)
{
return a*b/gys(a,b);
}
long gbs(long a,long b,long c)
{
return gbs(a,b)*c/gys(gbs(a,b),c);
}
long gbs(long a,long b,long c,long d)
{
return gbs(a,b,c)*d/gys(gbs(a,b,c),d);
}
void main()
{
long a,b,c,d;
long gyshu,gbshu;
printf("輸入四個數:");
scanf("%ld%ld%ld%ld",&a,&b,&c,&d);
gyshu=gys(a,b,c,d);
gbshu=gbs(a,b,c,d);
printf("%ld、%ld、%ld、%ld 的最大公約數是:%ld\n",a,b,c,d,gyshu);
printf("%ld、%ld、%ld、%ld 的最小公倍數是:%ld\n",a,b,c,d,gbshu);
}


/*
====================================================================
評:
要點在於重複呼叫!始終把計算結果作為一個數,就實現了先計算兩個數a,b,
將gys(a,b)或gbs(a,b)作為一個數與c重新呼叫函式“gys”或“gbs”,同理,
將gys(a,b,c)或gbs(a,b,c)作為一個數與重新呼叫函式“gys”或“gbs”,
甚至可以實現更多數字的公約數和公倍數!如果數字比較多,而且大,就需要
改為double型!
缺點:顯然這種方法寫程式雖然直觀但是很慢!讀者可以試著用一個temp變數
儲存最新的公約數,直到最後一個公約數求完為之。則問題轉化為始終求兩個
數的公約數。
=====================================================================
*/