我尝试在 projecteuler.net 中解决问题集16 。我试图找到2^1000
,我在C中用一个名为power()
的函数编写了一个代码。这里的问题是,如果我将printf()
置于power()
内以获取结果值,答案为10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376.000000
,但如果我在power()
中使用返回值并尝试从main()
打印结果,则答案为-2147483648.000000
。
这是我的代码。
#include <stdio.h>
int power(double base,int ex)
{
int i = 1;
double final = 0;
double ans = 1;
while (i <= ex){
ans *= base;
i++;
}
printf("%lf\n",ans); // return ans;
}
int main()
{
double num;
double result;
int power_value;
printf("enter the base value\n");
scanf("%lf",&num);
printf("enter the exponent value\n");
scanf("%d",&power_value);
power(num,power_value); //result = power(num,power_value)
//printf("%lf",result);
}
答案 0 :(得分:2)
在power
内而不是main
内打印不同内容的原因是因为power
的返回类型为int
。结果,该值被截断为适合int
。
将返回类型更改为double
,使其与您正在使用的变量类型相匹配,您将获得预期的结果。
double power(double base,int ex)
正如其他人所提到的那样,这个数字大于int
和大多数数字的范围,这个数字无法在double
中准确表示。但是,在这种特殊情况下,因为您计算的数字是2的幂,所以可以完全表示。如果你选择了2(或2的幂)之外的基数,结果将不准确。
答案 1 :(得分:1)
您想要计算的数字实际上远远大于C可以处理的标准类型。今天的机器上的long
几乎总是宽64位,因此可以存储在其中的最大数量类似于 2 ^ 64 = 18.446.744.073.709.551.615&lt; 2 ^ 2000
此外,您无法使用double main() { }
启动程序。规范要求您使用int
或void
。
你必须找到一些为你做计算的图书馆。