|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这串代码输入33以上的值,打印出来的结果就会出错。。为什么呢?
题目:
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
- #include <stdio.h>
- int jc(int n);
- int main()
- {
- int e,i;
- scanf("%d",&e);
- double sum = 0;
- for(i = 0;i <= e;i++)
- {
- sum += 1.0/jc(i);
- }
- printf("%.8lf",sum);
- return 0;
- }
- int jc(int n)
- {
- int i,sum = 1;
- for(i = 2;i <= n;i++)
- {
- sum *= i;
- }
- return sum;
- }
复制代码
本帖最后由 isdkz 于 2023-5-5 22:35 编辑
这段代码在计算阶乘时采用了 int 类型来存储结果。当输入的值大于 33 时,阶乘计算的结果会超过 int 类型的最大值(231 - 1 = 2,147,483,647)。这将导致整数溢出,从而使计算的结果出错。为了避免这个问题,我们可以将阶乘函数的返回值类型改为更大的数据类型,如 long long 或者 double。
同时,我们也需要使用 double 类型的变量进行累乘。这是修改后的代码:
- #include <stdio.h>
- double jc(int n);
- int main()
- {
- int e, i;
- scanf("%d", &e);
- double sum = 0;
- for (i = 0; i <= e; i++)
- {
- sum += 1.0 / jc(i);
- }
- printf("%.8lf", sum);
- return 0;
- }
- double jc(int n)
- {
- int i;
- double sum = 1;
- for (i = 2; i <= n; i++)
- {
- sum *= i;
- }
- return sum;
- }
复制代码
这样,当输入大于33的数时,计算结果就不会因为整数溢出而出错了。
|
|