求助!关于函数返回值因为过大而爆精度的问题

Aincrad 2016-03-23 11:14:27
#include <bits/stdc++.h> 
using namespace std;

long long fac(int n)
{
if(n == 1) return 1;
else return n*fac(n-1);
}

long long f(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
if(n == 3) return 5;
return f(n-1)+f(n-2)*(n-1)+f(n-3)*fac(n-1)/(2*fac(n-3));
}

main()
{
int n ;
while(1)
{
scanf("%d",&n);
if(n == 0) break;
printf("%lld\n",f(n));
}
}

比如这段代码,前15个都是正确的答案, 但是从第16开始 答案就是错误的了而且偏小,这是什么原因?遇到这种问题应该如何处理??求大神告知呀。
...全文
136 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-24
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
小灸舞 2016-03-24
  • 打赏
  • 举报
回复
大数一般用数组存储,字符数组,整数数组也可以,以下求阶乘的代码供楼主参考

#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n;
	int a[9000]; //确保保存最终运算结果的数组足够大
	int digit = 1; //位数
	int temp;   //阶乘的任一元素与临时结果的某位的乘积结果
	int i, j, carry; //carry:进位

	printf("please in put n:\n");
	scanf("%d",&n);
	a[0] = 1;   //将结果先初始化为1

	for ( i=2; i<=n; i++ )  //开始阶乘,阶乘元素从2开始依次"登场"
	{  //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
		for( j=1, carry=0;  j<=digit; j++ )
		{
			temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
			a[j-1] = temp % 10; //更新临时结果的位上信息
			carry = temp / 10; //看是否有进位
		}
		while(carry)
		{    //如果有进位
			a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
			carry = carry / 10; //看还能不能进位
		}
	}
	printf("n ! = ");    //显示结果
	for(j = digit; j >=1;j--)
	{
		printf("%d",a[j-1]);
	}
	printf("\n");
	system("pause");
	return 0;
}
ITAK 2016-03-24
  • 打赏
  • 举报
回复
高精度 你可以用Java的大数 也可以采用字符串,或者直接采用数组 每一个数组可以存多位
苏叔叔 2016-03-23
  • 打赏
  • 举报
回复
改用字符串存储

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧