最小公倍数与最大公约数问题:
描述 Description
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1.P、Q是正整数
2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
/*
最小公倍数与最大公约数问题:
描述 Description
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1.P、Q是正整数
2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
输入格式 Input Format
两个正整数
输出格式 Output Format
满足条件的所有可能的两个正整数的个数
*/
/*
搜索法:
根据最小公倍数的定义可知:
若:x0 为 x,y 的最大公约数,y0 为x,y 的最小公倍数,
由定义得:
(x/x0)*(y/x0)*x0 = x*y/x0 = y0 ;
即:x0*y0 = x * y ;
设:i=x/x0,j=y/xo, 则: i*j = y0/x0 且: i,j互质,因此:我们只要找到所有
满足条件的:i,j即可
由于具有对称性,因此只要求: 1--sqrt(y0/x0) 范围内的结果,然如乘以2就OK了
*/
/*
NO.1
*/
#include < stdio.h >
int gcd ( int a, int b)
{
if ( b == 0 )
return a ;
else
return gcd(b,a % b) ;
}
int is_fu_ze( int a, int b)
{
if (gcd(a,b) == 1 )
return 1 ;
else
return 0 ;
}
int main( void )
{
long x0,y0,i,j,k,total = 0 ;
scanf( " %ld %ld " , & x0, & y0);
if ( y0 % x0 != 0 || x0 == y0)
{
( x0 == y0) ? printf( " 1 " ) : printf( " 0 " );
return 0 ;
}
k = y0 / x0 ;
j = ( int )sqrt(( double )k) ;
for (i = 1 ; i <= j ; i ++ )
if ( k % i == 0 && is_fu_ze(i,k / i) )
{
total ++ ;
printf( " %ld %ld " ,i,k / i);
}
printf( " total = %ld " ,total * 2 ) ;
system( " pause " );
return 0 ;
}
/*
NO.2
*/
/* 找规律法:
n = 2^k ; 其中K是YO/X0的质因子个数
*/
#include < stdio.h >
int main( void )
{
long x0,y0 ;
long k,total = 0 ;
int i,j,num = 0 ;
scanf( " %d %d " , & x0, & y0);
if ( y0 % x0 != 0 || y0 == x0)
{
( x0 == y0) ? printf( " 1 " ) : printf( " 0 " );
return 0 ;
}
k = y0 / x0 ;
j = 2 ;
while ( 1 )
{
if (k % j == 0 )
{
while (k % j == 0 && k != j)
k /= j ;
num ++ ;
if (k == j)
break ;
}
j ++ ;
}
total = 1 ;
for (i = 1 ; i <= num ; i ++ )
total *= 2 ;
printf( " %ld " ,total);
return 0 ;
}
描述 Description
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1.P、Q是正整数
2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
/*
最小公倍数与最大公约数问题:
描述 Description
输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
条件:1.P、Q是正整数
2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
试求,满足条件的所有可能的两个正整数的个数。
输入格式 Input Format
两个正整数
输出格式 Output Format
满足条件的所有可能的两个正整数的个数
*/
/*
搜索法:
根据最小公倍数的定义可知:
若:x0 为 x,y 的最大公约数,y0 为x,y 的最小公倍数,
由定义得:
(x/x0)*(y/x0)*x0 = x*y/x0 = y0 ;
即:x0*y0 = x * y ;
设:i=x/x0,j=y/xo, 则: i*j = y0/x0 且: i,j互质,因此:我们只要找到所有
满足条件的:i,j即可
由于具有对称性,因此只要求: 1--sqrt(y0/x0) 范围内的结果,然如乘以2就OK了
*/
/*
NO.1
*/
#include < stdio.h >
int gcd ( int a, int b)
{
if ( b == 0 )
return a ;
else
return gcd(b,a % b) ;
}
int is_fu_ze( int a, int b)
{
if (gcd(a,b) == 1 )
return 1 ;
else
return 0 ;
}
int main( void )
{
long x0,y0,i,j,k,total = 0 ;
scanf( " %ld %ld " , & x0, & y0);
if ( y0 % x0 != 0 || x0 == y0)
{
( x0 == y0) ? printf( " 1 " ) : printf( " 0 " );
return 0 ;
}
k = y0 / x0 ;
j = ( int )sqrt(( double )k) ;
for (i = 1 ; i <= j ; i ++ )
if ( k % i == 0 && is_fu_ze(i,k / i) )
{
total ++ ;
printf( " %ld %ld " ,i,k / i);
}
printf( " total = %ld " ,total * 2 ) ;
system( " pause " );
return 0 ;
}
/*
NO.2
*/
/* 找规律法:
n = 2^k ; 其中K是YO/X0的质因子个数
*/
#include < stdio.h >
int main( void )
{
long x0,y0 ;
long k,total = 0 ;
int i,j,num = 0 ;
scanf( " %d %d " , & x0, & y0);
if ( y0 % x0 != 0 || y0 == x0)
{
( x0 == y0) ? printf( " 1 " ) : printf( " 0 " );
return 0 ;
}
k = y0 / x0 ;
j = 2 ;
while ( 1 )
{
if (k % j == 0 )
{
while (k % j == 0 && k != j)
k /= j ;
num ++ ;
if (k == j)
break ;
}
j ++ ;
}
total = 1 ;
for (i = 1 ; i <= num ; i ++ )
total *= 2 ;
printf( " %ld " ,total);
return 0 ;
}