- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
发表于 2008-12-8 14:43:57
|
显示全部楼层
#include
#include
#include
#define DefaultBitLength 128
int main(void)
{
mpfr_t a, b, low, hi, lf, t;
double dLow, dHi, dLf, dA;
int find = 0;
long i = 0;
mpfr_init2(a, DefaultBitLength);
mpfr_set_d(a, 2.0, GMP_RNDD);
mpfr_init2(b, DefaultBitLength);
mpfr_set_d(b, 1.0, GMP_RNDD);
mpfr_init2(low, DefaultBitLength);
mpfr_init2(hi, DefaultBitLength);
mpfr_init2(lf, DefaultBitLength);
mpfr_set_d(lf, 0.0, GMP_RNDD);
mpfr_init2(t, DefaultBitLength);
printf("请输入上界: ");
scanf("%lf", &dHi);
printf("请输入下界: ");
scanf("%lf", &dLow);
// printf("当前界限[%f, %f]\n", dLow, dHi);
mpfr_set_d(low, dLow, GMP_RNDD);
mpfr_set_d(hi, dHi, GMP_RNDD);
mpfr_log10(low, low, GMP_RNDD);
mpfr_log10(hi, hi, GMP_RNDD);
while (1)
{
mpfr_log10(t, a, GMP_RNDD);
mpfr_add(lf, lf, t, GMP_RNDD);
if (mpfr_cmp_d(lf, 1.0) >= 0)
mpfr_sub_ui(lf, lf, 1, GMP_RNDD);
if ((mpfr_cmp(lf, low) >= 0) && (mpfr_cmp(lf, hi) < 0))
{
find = 1;
break;
}
mpfr_add(a, a, b, GMP_RNDD);
if (mpfr_cmp_d(a, 10.0) >= 0)
{
i++;
mpfr_div_ui(b, b, 10, GMP_RNDD);
mpfr_add_ui(a, b, 1, GMP_RNDD);
}
}
if (find)
{
dLf = mpfr_get_d1(lf);
while (i > 0)
{
mpfr_mul_ui(a, a, 10, GMP_RNDD);
i--;
}
dA = mpfr_get_d1(a);
printf("当前界限下的阶乘%.0f!, 对应的对数%.15f", dA, dLf);
}
mpfr_clear(a);
mpfr_clear(b);
mpfr_clear(low);
mpfr_clear(hi);
mpfr_clear(lf);
mpfr_clear(t);
return 1;
}
////////////////////////////////////////////////////////
利用mpfr可写出适合超过100000000的阶乘的一个寻找程序
但似乎速度慢很多哦 |
|