解题思路:
输入一个整数N,求1到它的所有数阶乘的和;
先求阶乘,在求和;
注意事项:
把变量定义得长一些,否则会精度缺失出错;
①:double,float,int能表示的最大数、最小数及其有效位数对科学计算具有重要意义,超过了最大值、最小值变量就无法表示,需要的有效位数超过变量能表示的有效位数就会导致精度损失。
②:要获取double,float,int型变量对应的能表示的最大值最小值非常简单,C++内已经定义好了它们,分别为DLB_MAX,DLB_MIN,FLT_MAX,FLT_MIN,INT_MAX,INT_MIN。
③:为深入理解最大值、最小值及有效位数的影响,做了以下小测试:
1):double tst3 = 1.7976931348623157e+308; ///赋给tst3的值正是DBL_MAX的值
此时,tst3的值仍然为1.7976931348623157e+308,不存在偏差。
2): 当值超过DBL_MAX时,如:
double tst3 = 1.7976931348623159e+308;
此时,tst3的值仍然为1.7976931348623157e+308,与正确值相差2e+292!!
这种超过界限的错误容易理解,也好发现,容易忽略的往往是有效位数有限而造成的精度损失的问题,
3):经测试,double的有效位数为17位,超过17位则因位数有限而造成精度损失,例如:
double tst3 = 1.2345678912345678e+24;
此时,tst3仍能正确表示所赋给的值,但是,当有效位数超过17位时,如:
double tst3 = 1.23456789123456789123e+24;
此时,tst3的值仍然为1.2345678912345678e+24,相差非常大,虽然在可表示的范围内(<DBL_MAX),但仍然有非常大的精度损失!
4):综上所述,double、float、int型的变量能表示的最大数、最小数分别为DLB_MAX,DLB_MIN,FLT_MAX,FLT_MIN,INT_MAX,INT_MIN;但是并不意味着任何在DLB_MIN与DLB_MAX间的数double型变量都能表示,应该说,由于受有效位数的限制,还有很多数是double型变量不能表示的,float,int也类似。
参考代码:
#include<stdio.h> int main() { long double sum=0,sn=1; int n; scanf("%d",&n); for(int i=1;i<=n;i++) { sn=sn*i; sum=sum+sn; } printf("%.0Lf",sum); return 0; }
别忘点赞哦-.-
0.0分
74 人评分
#include<iostream> using namespace std; int main() { long long i,j,st=0,s,s0=1; cin>>s; for(i=1;i<=s;i++) { for(j=i;j>=1;j--) { s0=s0*j; } st+=s0; } cout<<st; return 0; } 请问一下哪里有问题哈
原题里有n不大于20的条件,题解中没有这个判定就显得不是很标准。我觉得要在scanf外面套上个do-while循环,条件为while(n>20),这样标准一些
奔跑中的蜗牛 2018-11-13 20:02:26 |
我这样写了还是错,都不晓得错哪里。。。
帮忙看一下哪儿错了 #include<stdio.h> int main() { long double sum,sn; int c,d; scanf("%d",&c); if(c<20){ sum=0,sn=1; for(d=1;d<=c;d++) { sn=sn*d; sum=sn+sum; } printf("%.0lf\n",sum); } return 0; }
枫吹起落 2018-07-24 18:53:20 |
哦,懂了,我的if那儿要变成c<=20;然后那个long double 输出的时候要用%.0Lf
Manchester 2018-07-28 19:02:50 |
-.-
mingw 使用的是Windows的运行库,不支持 long double输出 http://tieba.baidu.com/p/1508497984
likky 2018-11-18 20:36:13 |
codeblocks也不支持。。。。
#include<stdio.h> int main() { int i,n; long double Sn=0,S1=1; scanf("%d",&n); if(i=1;i<=n;i++) { S1=S1*i; Sn=Sn+S1; } printf("%.0lf",Sn); return 0; } 不知道哪里出了问题,想请教一下。。。。
这个代码答案都不对,我调试过了,输入五,得到-0;而且题目是有范围限制的。 不知道这个对不对(试过提交,但系统评定是错的) #include<stdio.h> int main() { int n,i; double Sn=0,fact=1; scanf("%d",&n); if(n<=20) { for(i=1;i<=n;i++) { fact=fact*i; Sn=Sn+fact; } printf("%.0f\n",Sn); } else { printf("溢出\n"); } return 0; }
这和编译器有关系么?我用函数模块递归,主函数里循环,dev上测试有效,提交答案错误。
Manchester 2018-04-15 21:51:29 |
递归容易溢出,不同的编译器对代码正确性有着不同的要求
输出格式Lf与lf是有区别的么?为什么我的lf是运行错误?!摸不着头脑
Manchester 2018-04-15 20:43:39 |
long double 要大写
DNA (C++代码)浏览:650 |
点我有惊喜!你懂得!浏览:2212 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:544 |
C二级辅导-计负均正 (C语言代码)浏览:508 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:520 |
C语言程序设计教程(第三版)课后习题9.2 (Java代码)浏览:608 |
母牛的故事 (C语言代码)浏览:435 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:694 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:505 |
1157题解浏览:711 |
Cauchy 2018-11-21 21:29:20 |
s0被累加后要恢复为1