C趣味程序(二)(07)求多個(gè)整數(shù)的公約數(shù)與最小公倍數(shù)

字號(hào):

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;
    }