作业帮 > 综合 > 作业

只使用c语言解决对于两个整数G和L(1

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/27 15:57:58
只使用c语言解决
对于两个整数G和L(1
#include <stdio.h>
#include <stdlib.h>

int GCD( int a, int b )
{
    return b ? GCD( b, a%b ) : a;
}

int LCM( int a, int b )
{
    return (a*b)/GCD(a,b);
}

int nGCD( int *a, int n )
{
    if ( n==1 ) return *a;
    return GCD( a[n-1], nGCD(a,n-1) );
}

int nLCM( int *a, int n )
{
    if ( n==1 ) return *a;
    return LCM( a[n-1], nLCM(a,n-1) );
}

int getCnt( int G, int L )
{
    int cnt=0, a[3], x, y, z;
    for( x=G; x<=L; x++ )
    {
        if ( L%x != 0 ) continue;
        for( y=G; y<=L; y++ )
        {
            if ( L%y != 0 ) continue;
            for( z=G; z<=L; z++ )
            {
                if ( L%z != 0 ) continue;
                a[0]=x, a[1]=y, a[2]=z;
                if( nGCD(a,3)==G && nLCM(a,3)==L )
                {
                    cnt++;
                }
            }
        }
    }
    return cnt;
}
int main()
{
    int n=0, *G, *L, *CNT, i;
    scanf( "%d", &n );
    if ( n <= 0 ) return 1;
    CNT = (int*)malloc( n*sizeof(int) );
    G = (int*)malloc( n*sizeof(int) );
    L = (int*)malloc( n*sizeof(int) );
    for( i=0; i<n; i++ )
        scanf( "%d %d", &G[i], &L[i] );
    for( i=0; i<n; i++ )
    {
        CNT[i] = getCnt( G[i], L[i] );
        printf( "%d\n", CNT[i] );
    }
    free( CNT );
    free( L );
    free( G );
}
再问: 你好,出现这种情况怎么破

再答: 算法不好,我也没辙了。。。
int getCnt( int G, int L )
{
    int cnt=0, a[3], x, y, z;
    for( x=G; x<=L; x+=G )
    {
        if ( L%x != 0 && x%G!=0 ) continue;
        for( y=G; y<=L; y+=G )
        {
            if ( L%y != 0 && y%G!=0 ) continue;
            for( z=G; z<=L; z+=G )
            {
                if ( L%z != 0 && z%G!=0 ) continue;
                a[0]=x, a[1]=y, a[2]=z;
                if( nGCD(a,3)==G && nLCM(a,3)==L )
                {
                    cnt++;
                }
            }
        }
    }
    return cnt;
}
再答: 程序改了改,时间快了很多,再优化我也没辙了