加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数阶乘思考

发布时间:2020-12-14 03:57:42 所属栏目:大数据 来源:网络整理
导读:? 最近一场校招比试题考的是编程实现9999!,最后面试官竟然因为我写的程序最复杂给我一次面试机会,最后发现招聘的岗位是偏向于硬件,最后就没有最后了。 面试官说这个问题应该是很简单,直接long double?n=1.0;for(int i=1;i10000;i++)n*=i;printf("%e",n)

? 最近一场校招比试题考的是编程实现9999!,最后面试官竟然因为我写的程序最复杂给我一次面试机会,最后发现招聘的岗位是偏向于硬件,最后就没有最后了。

面试官说这个问题应该是很简单,直接long double?n=1.0;for(int i=1;i<10000;i++)n*=i;printf("%e",n);回来之后我在在vs2008运行,截图如下

在这里说一下float double的最大存储吧

float?32?6-7?-3.4*10(-38)~3.4*10(38)

double?64?15-16?-1.7*10(-308)~1.7*10(308)

long?double?128?18-19?-1.2*10(-4932)~1.2*10(4932)

下面废话不多说给出博主的解决方法:

#include <iostream>
using namespace std;
struct bigNum{
double base;
unsigned long eps;
};
void main(){
	bigNum plus;plus.base=1.0;plus.eps=0;
for(int i=1;i<10000;i++){
plus.base*=i;
if(plus.base>100000) {plus.eps+=5;plus.base/=100000;}
else if(plus.base>10000) {plus.eps+=4;plus.base/=10000;}
else if(plus.base>1000) {plus.eps+=3;plus.base/=1000;}
else if(plus.base>100) {plus.eps+=2;plus.base/=100;}
     else if(plus.base>10) {plus.eps+=1;plus.base/=10;}
}
cout<<"1*2*3*4*5*....*9999="<<plus.base<<"乘以10的"<<plus.eps<<"次方"<<endl;
}


输出结果:


与真实结果还是表近:

2846259680917054518906413212119868890148051401702799230794179994274411340003764443772990786757784775815884062142317........

虽然博主的结果不是精确的,但是结果还是可以接受的。博主的程序还可以改进实现更大数的阶乘。下面是一些牛人们实现的大数阶乘,但个人觉得都比较复杂,大家觉得好理解就行不多说了。

http://www.oschina.net/search?scope=code&q=%E5%A4%A7%E6%95%B0%E9%98%B6%E4%B9%98

http://www.cnblogs.com/confach/archive/2005/07/14/192703.html


希望大神指导

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读