#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开始 答案就是错误的了而且偏小,这是什么原因?遇到这种问题应该怎么样处理?求高手告知呀。
解决方案:5分
改用字符串存储
解决方案:10分
高精度 你可以用Java的大数 也可以采用字符串,或直接采用数组 每一个数组可以存多位
解决方案:10分
大数一般用数组存储,字符数组,整数数组也可以,以下求阶乘的代码供LZ参考
#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; }