您的位置:首页 > 其它

UVa 10375 - Choose and divide

2012-09-26 22:36 344 查看
简单的分解质因数约分

#include <cstdio>
#include <cstdlib>
#include <cstring>

const int MAXN = 10000 + 10;

bool Prime[MAXN];

int aaa[5];
int bbb[5];
int num[2][MAXN];

void GetPrime()
{
memset( Prime, true, sizeof(Prime) );
Prime[0] = false ;
Prime[1] = false ;
for ( int i = 2; i < MAXN; i++ )
if ( Prime[i] )
{
for ( int j = i * i; j < MAXN; j += i )
Prime[j] = false;
}
return;
}

int cmp( const void *a, const void *b )
{
return *(int *)a - *(int *)b;
}

int max( int a, int b )
{
return a > b ? a : b;
}

int min( int a, int b )
{
return a < b ? a : b;
}

void show()
{
for ( int i = 0; i < 20; i++ )
printf("%d ", num[0][i]);
puts("\n---------------------");
for ( int i = 0; i < 20; i++ )
printf("%d ", num[1][i]);
puts("\n----------------");
return;
}

int main()
{
GetPrime();
int p, q, r, s;
while ( scanf( "%d%d%d%d", &p, &q, &r, &s ) != EOF )
{
memset( num, 0, sizeof(num) );

aaa[0] = p;
aaa[1] = s;
aaa[2] = r - s;
bbb[0] = q;
bbb[1] = r;
bbb[2] = p - q;
qsort( aaa, 3, sizeof(int), cmp );
qsort( bbb, 3, sizeof(int), cmp );

//        for ( int i = 0; i < 3; i++ ) printf("%d %d\n", aaa[i], bbb[i]);

int down, up;
for ( int i = 0; i < 3; i++ )
{
int xxx;
if ( aaa[i] == bbb[i] ) continue;
else if ( aaa[i] > bbb[i] )
{
down = bbb[i] + 1;
up = aaa[i];
xxx = 0;
}
else
{
down = aaa[i] + 1;
up = bbb[i];
xxx = 1;
}
for ( int i = down; i <= up; i++ )
{
int tp = i;
//            printf("tp = %d\n", tp);
int yyy = 2;
while ( tp != 1 )
{
if ( Prime[yyy] && tp % yyy == 0 )
{
//                  printf("yyy = %d\n", yyy);
tp /= yyy;
++num[xxx][yyy];
}
else ++yyy;
}
}
}

for ( int i = 2; i < MAXN; i++ )
if ( Prime[i] )
{
if ( num[0][i] > num[1][i] )
{
num[0][i] -= num[1][i];
num[1][i] = 0;
}
else
{
num[1][i] -= num[0][i];
num[0][i] = 0;
}
}

//      show();

double ans = 1.0;
for ( int i = 2; i < MAXN; i++ )
if ( Prime[i] )
{
int fenzi = 1, fenmu = 1;
for ( int j = 0; j < num[0][i]; j++ ) fenzi *= i;
for ( int j = 0; j < num[1][i]; j++ ) fenmu *= i;
ans *= (double)fenzi/fenmu;
}

printf( "%.5lf\n", ans );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: