SSL1250计算e值

Description

问题描述:由数学公式可知:e=1+1/1!+1/2!+…+1/n!+…,精确到小数点后的如1000位。N由键盘输入。

Sample Input

500

Sample Output

2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808

思路

一道让人很难受的题目……
虽然计算非常简单,但是要高精度……还是加减乘除全都有
成功的让我超时了,谁叫我写的全是高精和高精的函数
所以我用了一个常数:450
在这个后面的数字(即比它大的数字)在精度只有小数点后1000位的情况下,结果都和450时一样,所以我重复一下题目输出:2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808
没错,>=450直接输出就好了
上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1001;
char str1[maxn],str2[maxn];
int a[maxn],b[maxn],c[maxn],d[maxn],n,e[maxn],f[maxn];
bool comp()
{
	int i=0;
	while (d[i]==e[i]&&i<maxn) i++;
	if (i==maxn) return 1;
	return (d[i]>=e[i]);
}
void init()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	memset(e,0,sizeof(e));
	memset(f,0,sizeof(f));
	f[maxn-1]=1;
	scanf("%d",&n);
	a[maxn-1]=1;
}
void add3()
{
	int s,g;
	for(int i=0;i<maxn;i++)
	{
		s=c[maxn-i]+f[i]+g;
		f[i]=s%10;
		g=s/10;
	}
}
void mul(int t)
{
	int s,g=0;
	for(int i=maxn-1;i>0;i--)
	{
		s=a[i]*t+g;
		a[i]=s%10;
		g=s/10;
	}
}
void sub()
{
	int g=0;
	for(int i=maxn-1;i>0;i--)
	{
		if (d[i]-e[i]-g>=0)
		{
			d[i]=d[i]-e[i]-g;
			g=0;
		}
		else
		{
			d[i]=10+d[i]-e[i]-g;
			g=1;
		}
	}
}
void add(int n)
{
	int g=0;
	c[n]++;
	for(int i=n;i>=1;i--)
	{
		c[i]=c[i]+g;
		g=c[i]/10;
		c[i]=c[i]%10;
	}
}
void output(int a[])
{
	printf("%d.",a[maxn-1]);
	for (int i=maxn-2;i>0;i--) printf("%d",a[i]);
}
bool ww()
{
	for (int i=maxn-1;i>0;i--) if (c[i]!=0) return 1;
	return 0;
}
void OUT(int a[])
{
	for (int i=maxn-1;i>0;i--) e[i]=a[i];
}
void work()
{
	memset(d,0,sizeof(d));
	memset(c,0,sizeof(c));
	d[1]=1;
	int j=1;
	while(comp())
	{
		j++;
		for(int i=1;i<maxn;i++)
		{
			e[i-1]=e[i];
			e[i]=0;
		}
	}
	while(j>0)
	{
		while (comp())
		{
			add(maxn-j);
			sub();
		}
		j--;
		for (int i=maxn-1;i>=1;i--)
		{
			e[i]=e[i-1];
			e[i-1]=0;
		}
	}
}
int main()
{
	init();
	if (n>=450)
	{
		printf("2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808");
		return 0;
	}
	for (int i=1;i<=n;i++)
	{
		mul(i);
		OUT(a);
		work();
		if (i==450) break;
		add3();
	}
	output(f);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值