这是我获取 2 根的代码
#include <stdio.h>
unsigned long long root(int n);
int main()
{
int n,i;
unsigned long long c;
n=10;
for(i=1;i<=n;i++)
{
c=root(i);
printf("%d decimal digits:%llu\n",i,c);
}
return 0;
}
unsigned long long root(int n)
{ unsigned long long int m,d;
d=pow(10,n);
m=2*pow(10,2*n);
while (pow(d,2)<=m)
{
d++;
}
return d-1;
}
Run Code Online (Sandbox Code Playgroud)
Unsigned long long int 可以支持从 0 到 $2^64-1$。我认为这足以计算 10 位小数。
我希望 10 位十进制的输出应该是14142135623
您实际上将要10 ** 20,而不是10 ** 10,因为这条线使用2 * n(n您传递到的地方10):
m=2*pow(10,2*n);
Run Code Online (Sandbox Code Playgroud)
因此,即使忽略您的其他问题,这也行不通(2 ** 64不足以处理 20 位数字)。
pow是根据 实现的double,double通常只有 53 位的整数精度。所以你实际上并没有获得 64 位的精度。
如果您想对超出double可以准确表示的数字进行整数取幂,则需要编写自己的基于整数的pow.