| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这题好邪门~两种写法差不多,一个过一个不过~求牛人指点迷津~第一种:WA的,还没轮到判PE呢= =!:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int gcd(int a, int b)
{
if(b == 0) return a;
else return gcd(b, a%b);
}
double Abs(double x)
{
if(x < 0) return -x;
else return x;
}
double Round(double x)
{
double tmp1, tmp2;
tmp1 = floor(x);
tmp2 = ceil(x);
if(Abs(x-tmp1) > Abs(x-tmp2)) return tmp2;
else return tmp1;
}
int main()
{
int x, y, d, flag, i;
double xx, yy, ratio, pre, tmp;
while(scanf("%d%d", &x, &y) != EOF)
{
d = gcd(x, y);
x /= d;
y /= d;
if(x >= y) flag = 0;
else flag = 1;
if(flag == 1) swap(x, y);
xx = double(x);
yy = double(y);
ratio = xx / yy;
pre = 1000000.0;
for(i = 1; i <= y; i++)
{
yy = (double)i;
xx = Round(yy*ratio);
tmp = Abs(xx/yy-ratio);
if(pre <= tmp) continue;
else
{
pre = tmp;
if(flag == 0)
printf("%.0f/%.0f\n", xx, yy);
else
printf("%.0f/%.0f\n", yy, xx);
}
}
printf("\n");
}
return 0;
}
第二种,AC的~:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int gcd(int a, int b)
{
if(b == 0) return a;
else return gcd(b, a%b);
}
double Abs(double x)
{
if(x < 0) return -x;
else return x;
}
int Round(double x)
{
int t = (int)x;
if(x-t >= 0.5) t++;
return t;
}
int main()
{
int x, y, d, i, cc = 0;
double ratio, pre, tmp;
while(scanf("%d%d", &x, &y) != EOF)
{
if(cc) printf("\n");
d = gcd(x, y);
x /= d;
y /= d;
ratio = (double)x / y;
pre = 1000000.0;
for(i = 1; i <= y; i++)
{
tmp = (double)x*i/y;
d = Round(tmp);
tmp = Abs((double)d/i - ratio);
if(tmp < pre)
{
pre = tmp;
printf("%d/%d\n", d, i);
}
}
cc++;
}
return 0;
}
这两者区别有多大,可有牛人现身指点迷津??
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator