大数连乘解决若干数学问题
2013-03-18 12:50
134 查看
一.问题描述
n!或者c(n,m)=n*……(n-m+1)/n!或者p(n,m)= n*……(n-m+1),这些问题全都可通过连乘解决。
二.注意事项:
小数的组合数可以通过刘汝佳那种方式(ans=ans*b/a),通过10^num = n!判断(log10(n!))出阶乘的位数(num+1);
在阶乘中若是每个数组元素上存储多位(此时需要注意中间结果溢出问题),则输出需要printf("%5d")。
阶乘中间结果是否会溢出:比如2000的阶乘,就这“a[k] = a[k]*j + w”可能溢出;按存储一个数字分析,a[k]最大9,j最大1999,w最大是9,不会溢出。
三.程序代码
四.结束语
由于本人水平有限,疏漏之处在所难免,还望大牛不吝赐教……HPU张朋飞拜上(QQ:791909235)
n!或者c(n,m)=n*……(n-m+1)/n!或者p(n,m)= n*……(n-m+1),这些问题全都可通过连乘解决。
二.注意事项:
小数的组合数可以通过刘汝佳那种方式(ans=ans*b/a),通过10^num = n!判断(log10(n!))出阶乘的位数(num+1);
在阶乘中若是每个数组元素上存储多位(此时需要注意中间结果溢出问题),则输出需要printf("%5d")。
阶乘中间结果是否会溢出:比如2000的阶乘,就这“a[k] = a[k]*j + w”可能溢出;按存储一个数字分析,a[k]最大9,j最大1999,w最大是9,不会溢出。
三.程序代码
void liancheng(int m,int n)//n>m,由用户保证 { memset(a,0,sizeof(a)); int temp = n; //先把数字m拆分进数组a,低位在小下标 int i = 0;//最终结果位数 while(temp>0) { a[i++] = temp%10; temp/=10; } for(int j=n-1; j>=m;j++) { int w = 0;//进位 for(k=0; k<i; k++) { a[k] = a[k]*j + w; w = a[k]/10; a[k]%=10; } //扩展结果位数 while(w>0) { i++; a[i] = w%10; w /= 10; } } }
//下面结果连乘除以n!问题 memset(b,0,sizeof(b)); for(int t=2; t<=n; t++) { int s = 0;//s是余数 //下面的for循环每次完成除一个数的任务 for(int p=i; p>=0; p--)//从最高位开始 { s = s*10 + a[p];//不是 a[p] = a[p]*10 + s; b[p] = s/t;//商 ,b的下标没必要单独开 s %= t; } //一定在除数的 大循环体内 ,小循环外 while(b[i]==0)//写成 while(b[i]) 意思就完全不同了 i--;//下次被除数从哪一位开始除 //数组b的前i位都是 商,不包括前导0 //因为是连除,下面的产生新的被除数 送入a数组 for(int r=0; r<i; r++)//大循环体内 a[r] = b[r]; }
//输出结果 for(int q=i; q>=0; q--) cout<<a[q];
四.结束语
由于本人水平有限,疏漏之处在所难免,还望大牛不吝赐教……HPU张朋飞拜上(QQ:791909235)
相关文章推荐
- SilverLight部署的若干问题和解决方法
- Windows 下安装ArcGIS Server9遇到的若干问题及其解决方法
- CLM框架的编译及自己在编译过程中的若干问题的解决
- TabLayout的简单运用和若干问题的解决
- 关于UBUNTU网络若干问题的解决办法
- 动态规划与数学方程法解决楼层扔鸡蛋问题
- 数学建模坑爹的C程序解决问题
- 最近在项目中实践了一下Redis,过程中遇到并解决了若干问题,记录之.
- ubuntu安装常用的工具及解决若干问题
- 创业日记-使用数学方法解决实际问题
- 解决数学中的问题——两点间距离!
- 发现问题和解决问题若干
- 解决Bootstrap 附加导航(Affix)的问题和使用时若干注意事项
- Macos解决安装pip,python,scrapy,项目安装的若干问题方法
- 解决在QEMU上仿真STM32F429时出现的若干问题
- TabLayout的简单运用和若干问题的解决
- 动态规划与数学方程法解决楼层扔鸡蛋问题
- 一个用程序解决数学问题的网站
- Liferay portal 6.2 在windows10 中遇到的若干问题和解决
- 使用i3wm时出现的若干问题的解决办法