1. 程式人生 > >31、求最大公約數和最大公倍數

31、求最大公約數和最大公倍數

2017年 可能 b+ 意義 enter 最小公倍數 余數 c++ ==

求最大公約數和最大公倍數

一、求三個數的最大公約數和最大公倍數

/*
	時間:2017年6月30日20:14:33
	功能:求三個數的最大公約數與最小公倍數
*/ 

# include <stdio.h>

main() 
{ 
	 int x, y, z, a, b, min, max; 
 
	 printf("請輸入三個整數以空格分隔:"); 
 
	 scanf("%d %d %d", &x,&y,&z); 
	 if(x<y)
	 { 
		min = x; max = y;
	 }
	 else 
	 { 
		min = y; max = x;
	 }
	 if(min>z)
		min = z;								//求出三個數中最小數,賦給a;
	 if(max<z)
		max = z;								//求出三個數中最大數,賦給b;
 
	 for(a=min;a>=1;a--)					//(最大公約數不可能大於三個數中的最小數)用這三數去除以a,a的值每次-1;
											//也可以(a=1;a>=1;a++),或者(a=min;a<=min;a--)
	 {
		  if(x%a==0 && y%a==0 && z%a==0)	    //當三個數同時被a整除,此時a的值就是三個數的最大公約數;
		  break;								// 停止a窮舉;
	 }
	 for(b = max;;b++)						//(最小公倍數不會小於三個數中的最大數),起點用max賦值,可以減少無意義的窮舉;
											//(b = max;;b++)分號之間可以寫做(b = max;b>=max;b++)留空也一樣,但不能省略;號。
	 {
		  if(b%x==0 && b%y==0 && b%z==0)		//當b能被x、y、z同時整除,此時b的值就是三個數的最小公倍數;
		  break;								// 停止b窮舉;
	 }

	 printf("\n這三個數的最小數是:%d,最大數是:%d。\n", min, max);
	 printf("\n最大公約數是%d,最小公倍數是%d。\n\n", a, b); 
 

 
}
/*
在VC++6.0中執行的結果如下:
-------------------------
請輸入三個整數以空格分隔:1 5 6

這三個數的最小數是:1,最大數是:6。

最大公約數是1,最小公倍數是30。

-------------------------
*/

  

二、求兩個數的最大公約數和最大公倍數

/*
	2017年6月30日20:06:15
	求兩個數的最大公約數-輾轉相除法。
*/
# include <stdio.h>

int main(void)
{ 
	 int m, n, a, b, t;
	 printf("請入要求的兩個數,以空格分隔: m,n:");
	 scanf("%d %d",&m, &n);
	 if (m<n)
	 {
		 t = m;m = n;n = t;									// 先交換大小,保證被除數為大,除數為小;
	 }
	 a = m; b = n;
	 do 
	 {
		  t=a%b;										    //用大數除小數,得出余數;
		  a = b;											//將除數(小數)賦為被除數;
		  b = t;											//余數賦為除數,直到余數為0時跳出循環;
	 }	
	 while(b!=0);											//也可以寫成while(t!=0);
 
	 printf("最大公約數為:%d\n", a);						//a的值即為最大公約數;
 
	 printf("最小公倍數為:%d\n", m*n/a);

 return 0;
}

  

31、求最大公約數和最大公倍數