2.1.2 求多個(gè)整數(shù)的公約數(shù)與最小公倍數(shù)
對于3個(gè)或3個(gè)以上整數(shù),公約數(shù)與最小公倍數(shù)有以下性質(zhì):
(a1,a2,a3)=((a1,a2),a3)
(a1,a2,a3,a4)=((a1,a2,a3),a4),...
{a1,a2,a3}={{a1,a2},a3}
{a1,a2,a3,a4}={{a1,a2,a3},a4},...
應(yīng)用這一性質(zhì),要求n個(gè)數(shù)的公約數(shù),先求出前n-1個(gè)數(shù)的公約數(shù)t,再求第n個(gè)數(shù)與t的公約數(shù)。求n個(gè)數(shù)的最小公倍數(shù)也一樣。這樣遞推實(shí)現(xiàn)求多個(gè)整數(shù)的公約數(shù)與最小公倍數(shù)。
程序代碼如下:
#include
int gy(int,int);
int gb(int,int);
void main()
{
int a,b,c,d,i=2;
int aa[10];
printf("n個(gè)整數(shù)的公約記為(a1,a2,...an)\n");
printf("n個(gè)整數(shù)的最小公倍記為{a1,a2,...an}\n");
printf("n個(gè)整數(shù)逐個(gè)從鍵盤輸入,以-1終止\n");
printf("首先輸入兩個(gè)數(shù)a,b\n");
scanf("%d,%d",&a,&b);
c=a;
d=a;
aa[0]=a;aa[1]=b;
while(b>0)
{
c=gy(c,b); /*調(diào)用公約數(shù)函數(shù)*/
d=gb(d,b); /*調(diào)用最小公倍數(shù)函數(shù)*/
printf("輸入下一個(gè)整數(shù)(輸入-1結(jié)束):to b: ");
scanf("%d",&b);
aa[i]=b;
i++;
}
printf("(");
for(i=0;aa[i]!=-1;i++)
printf("%d,",aa[i]);
printf(") = %d\n",c);
printf("{");
for(i=0;aa[i]!=-1;i++)
printf("%d,",aa[i]);
printf("} = %d\n",d);
}
int gy(int x,int y)
{
int c;
for(c=x;c>=1;c--)
{
if((x/c==(float)x/c)&&(y/c==(float)y/c))
break;
}
return c;
}
int gb(int x,int y)
{
int d;
for(d=x; d<=x*y;d+=x)
{
if(d/y==(float)d/y) break;
}
return d;
}
對于3個(gè)或3個(gè)以上整數(shù),公約數(shù)與最小公倍數(shù)有以下性質(zhì):
(a1,a2,a3)=((a1,a2),a3)
(a1,a2,a3,a4)=((a1,a2,a3),a4),...
{a1,a2,a3}={{a1,a2},a3}
{a1,a2,a3,a4}={{a1,a2,a3},a4},...
應(yīng)用這一性質(zhì),要求n個(gè)數(shù)的公約數(shù),先求出前n-1個(gè)數(shù)的公約數(shù)t,再求第n個(gè)數(shù)與t的公約數(shù)。求n個(gè)數(shù)的最小公倍數(shù)也一樣。這樣遞推實(shí)現(xiàn)求多個(gè)整數(shù)的公約數(shù)與最小公倍數(shù)。
程序代碼如下:
#include
int gy(int,int);
int gb(int,int);
void main()
{
int a,b,c,d,i=2;
int aa[10];
printf("n個(gè)整數(shù)的公約記為(a1,a2,...an)\n");
printf("n個(gè)整數(shù)的最小公倍記為{a1,a2,...an}\n");
printf("n個(gè)整數(shù)逐個(gè)從鍵盤輸入,以-1終止\n");
printf("首先輸入兩個(gè)數(shù)a,b\n");
scanf("%d,%d",&a,&b);
c=a;
d=a;
aa[0]=a;aa[1]=b;
while(b>0)
{
c=gy(c,b); /*調(diào)用公約數(shù)函數(shù)*/
d=gb(d,b); /*調(diào)用最小公倍數(shù)函數(shù)*/
printf("輸入下一個(gè)整數(shù)(輸入-1結(jié)束):to b: ");
scanf("%d",&b);
aa[i]=b;
i++;
}
printf("(");
for(i=0;aa[i]!=-1;i++)
printf("%d,",aa[i]);
printf(") = %d\n",c);
printf("{");
for(i=0;aa[i]!=-1;i++)
printf("%d,",aa[i]);
printf("} = %d\n",d);
}
int gy(int x,int y)
{
int c;
for(c=x;c>=1;c--)
{
if((x/c==(float)x/c)&&(y/c==(float)y/c))
break;
}
return c;
}
int gb(int x,int y)
{
int d;
for(d=x; d<=x*y;d+=x)
{
if(d/y==(float)d/y) break;
}
return d;
}