读书人

大家帮忙看看哪里出错了总是有两个数

发布时间: 2012-05-01 12:48:58 作者: rapoo

大家帮忙看看哪里出错了,总是有两个数据错误。。。谢了。。。新手
已知a = (bc -1) / (b + c),给定a(1<=a<=60,000),求b和c,当有多个解时求(b + c)最小的解。

输出应满足b <= c。a,b,c都为正整数。
[code=C/C++][/code]
void main()
{
double a,b,c,rmd;
scanf("%lf",&a);
for(b=2*a+1;b>a;b--)
{
double prd=(a*b+1)/(b-a);
rmd=(a*b+1)-(b-a)*((int)prd);
if(rmd==0.0)
{
c=(a*b+1)/(b-a);
printf("%.lf\n%.lf\n",b,c);
}
}
}
[code=C/C++][/code]

[解决办法]
/*
* 分析:
* 把a作为已知量,根据原式尽量缩小b的取值范围,然后在该范围内遍历b,并
* 判断对应的c是否满足条件。
* bc / (b+c) = a + 1/(b+c);
* 所以a < bc/(b+c) < a+1;
* 所以a(b+c) -bc - a^2 <0;
* 既(b-a)(a-c) < 0;
* 所以a < b < c或 b < c < a;
* 又因为a < bc/(b+c) < bc/(2b)
* 所以c > 2a, a < b < c;
* 因为bc/2c < bc/(b+c) < a+1;
* 所以b < 2(a+1);
* 综上所述a < b < 2(a+1);
* */
程序如下:

C/C++ code
#include <stdio.h>#include <math.h>#define M 600000#define E 1e-10int main (void){ double a, b, c, minb, minc; minb = minc = 0; scanf ("%lf", &a); for (b=a+1; b < 2*(a+1); b++) {  c = (1+a*b) / (b-a);  if (b < c && fabs((int)c - c) < E)  {   if (fabs(minb) < E  && fabs(minc) < E ||     (b+c < minb+minc))   {    minb = b;    minc = c;   }  } } if (minb != 0 && minc != 0)  printf ("%.f\n%.f\n", minb, minc); return 0;} 

读书人网 >C语言

热点推荐