最接近平方数的阶乘数
4!=24, 5^2=25, 5^2-4!=15!=120, 11^2=121, 11^2-5!=1
7!=5040, 71^2=5041, 71^2-7!=1
问,还有没有其他阶乘数,跟平方数差很小 目前找到的指标是阶乘的平方根的小数部分的值与1的差
\( MIN(1 - | \sqrt{n!} - [\sqrt{n!}]|,| \sqrt{n!} - [\sqrt{n!}]|) \) 目前得到的结果n!,n<=10000以内
n=
224
309
879
1099
1494
2221
3739
最接近平方数 3739!的平方根小数部分前几位0.9999954 以前看过一道竞赛题\的解答,记得只有这三个解。 hujunhua 发表于 2019-11-2 06:20
以前看过一道竞赛题\的解答,记得只有这三个解。
嗯,还可以找稍微接近平方数的
这些数,大概是
\( n! = x^2 + O(x), x \in \NN \) 可以找出所有 n! 和平方数之差不超过 n 的数。 写了一个C/GMP的小程序,跑了几分钟,算出14万以内$n<=140000$, $n!$跟最接近的完全平方数的差的绝对值 小于$100n$ 的只有 $1!-11!$, 前11个数.
然后看到 老胡的评论,我立马终止了程序
即最接近 n! 的平方数,与 n! 的差最大约为`\sqrt{n!}`
#include <gmp.h>
#include <stdio.h>
int main()
{
mpz_t tmp, a, b;
mpz_init(tmp);
mpz_init(a);
mpz_init(b);
int n = 200000;
mpz_fac_ui(tmp,n);
for (int i = n+1; i < 5*n; ++i) {
mpz_mul_ui(tmp,tmp, i);
int ans = mpz_root(a, tmp, 2);
mpz_add_ui(b, a, 1);
mpz_mul(a, a, a);
mpz_mul(b, b, b);
mpz_sub(a, tmp, a);
mpz_sub(b, b, tmp);
if (mpz_cmpabs_ui(a, 1000*i) < 0) {
gmp_fprintf(stderr,"%d! - %Zd\n", i, a);
}
if (mpz_cmpabs_ui(b, 1000*i) < 0) {
gmp_fprintf(stderr,"%d! + %Zd\n", i, b);
}
gmp_fprintf(stdout,"%d\t", i);
}
mpz_clears(tmp, a, b, '\0');
return 0;
}
记 `x=\lfloor\sqrt{n!}\rfloor`, 那么最接近 n! 的平方数是 `x^2` 和 `(x+1)^2`之一,
设 `x^2=n!-a,(x+1)^2=n!+b`,
则 `a+b=2x+1` → `\min(a,b)≤x<\sqrt{n!}`
所我在6#的评论应该肯定地说“最接近 n! 的平方数,与 n! 的差小于`\sqrt{n!}`” 后面的计算越来越难,主要是数字迅速变大,得分配更大的浮点数了
页:
[1]
2