c++语言求100的阶乘,C++-100阶乘
解决方法就是自己构造数据结构.
可以参考Java中BigInteger的实现.
1. 数据结构中包含 标志位, -1表示负数, 1表示正数, 0表示0.
2. 用一个int数组 表示 这个大数. java里的实现, 数组为mag, 那么mag[0]表示的位数最大, 就是说是反过来看的, 保证mag[0]不为0.
BigInteger中乘法的实现, 和我们平时手算乘法公式类似, 一位一位乘, 要考虑进位. 主要源码如下, 两个int数组相乘得到结果的int数组:
final static long LONG_MASK = 0xffffffffL;
private int[] multiplyToLen(int[] x, int xlen, int[] y, int ylen, int[] z) {
int xstart = xlen - 1;
int ystart = ylen - 1;
if (z == null || z.length < (xlen+ ylen))
z = new int[xlen+ylen];
long carry = 0;
for (int j=ystart, k=ystart+1+xstart; j>=0; j--, k--) {
long product = (y[j] & LONG_MASK) *
(x[xstart] & LONG_MASK) + carry;
z[k] = (int)product;
carry = product >>> 32;
}
z[xstart] = (int)carry;
for (int i = xstart-1; i >= 0; i--) {
carry = 0;
for (int j=ystart, k=ystart+1+i; j>=0; j--, k--) {
long product = (y[j] & LONG_MASK) *
(x[i] & LONG_MASK) +
(z[k] & LONG_MASK) + carry;
z[k] = (int)product;
carry = product >>> 32;
}
z[i] = (int)carry;
}
return z;
}
拿到结果的int数组后, 去除开头的0.
回答@醉酒剑秋(33787218)的问题:
为什么0至xstart-1和xstart要分开,直接放在一个循环里面行不行?
: 这个手工在纸上计算一下543*434就知道, 首先计算543*4, 这里只需考虑每一位的乘, 加上上一次的进位即可; 接着算543*3, 需要考虑每一位的乘, 加上上一次的进位, 再加上 结果位上已有的值. 目测如果初始化结果数组z全为0, 则可以只用下面的那个循环来做; 但是现在两个循环明显效率要高一点点(第一个循环少了+(z[k] & LONG_MASK)), 在这种基础类里性能可是很重要的.
还有为什么或运算0xFFFFFFFFL?直接相乘可以吗
: 是与0xFFFFFFFFL, 注意0xFFFFFFFFL是long型, 这里是把int型转为与它数值相等的long; 否则直接int*int是会溢出的.
更新
还是有些要补充的地方:
1. java里是没有无符号数的, 所以int最大值为0x7fffffff(只用了31bit); 而在上面的程序中, 实际是把int当作了无符号数来用, 充分使用了这32个bit, 所以中间结果的int是作为 (int数)&0xffffffffL来使用的, 从java int型角度来说是会溢出的.
2. 中间结果的long值也是会溢出的, 所以这里用的是无符号右移>>>. -1>>>31 =1
c++语言求100的阶乘,C++-100阶乘相关推荐
- 用c语言求出1加到100的和
//求出1到100的和 #include"stdio.h" int main() { int i,sum=0; //把sum初始定义为0 for(i=1;i<101;i++) ...
- C语言求排列组合和阶乘
关于C语言求排列数.组合数以及阶乘的实验记录: 一.求排列数和组合数 以下公式中A(n,m)为排列数公式,C(n,m)为组合数公式. Cnm=n!m!(n−m)!=Anmm!=Cn−1m+Cn−1m− ...
- C语言编程>第二十三周 ⑤ 请补充main函数,该函数的功能是:求1~100(不包括100)以内所有素数的平均值。
例题:请补充main函数,该函数的功能是:求1-100(不包括100)以内所有素数的平均值. 仅在横线上填写所需的若干表达式或语句,请勿改动函数中的其它任何内容. 代码如下: #include< ...
- C语言循环求出2的10次幂,C语言求2的100次幂的结果.doc
C语言求2的100次幂的结果 求2的100次幂的结果 #include #include #include #include void main void int a,b,i; char s[40], ...
- c语言1到200能被4整除,c语言求[100,200]之间能被4整除,不能被5整除的数之和
C语言求100-500之间的素数.懂的人帮下我, #include#includevoidmain(){inti,j;for(j=101;j 用C语言编程求100-200之间能被3整除但不能被5整除的 ...
- C语言 古代经典算术题:百钱百鸡。用100元钱买100只鸡,已知公鸡每只5元,母鸡每只3元,小鸡一元3只,求出所有的卖法。
C语言 古代经典算术题:百钱百鸡.用100元钱买100只鸡,已知公鸡每只5元,母鸡每只3元,小鸡一元3只,求出所有的卖法. 代码: #include <stdio.h> void main ...
- python计算分段函数输出x+2的值怎么写_c语言求分段函数分段函数求解:输入 x ,计算并输出 y 的值:y=x+100 ( 当 x < 20) y= x ( 当...
题目: c语言求分段函数 分段函数求解:输入 x ,计算并输出 y 的值: y=x+100 ( 当 x < 20) y= x ( 当 2 0 ≤ x ≤ 100) y=x-100 ( 当 x & ...
- 使用C语言编写程序一个皮球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求当它第10次落地时,共经过了多少米?第10次反弹多高?写出完整代码并给出解释并对代码作出注释...
使用C语言编写程序一个皮球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹.求当它第10次落地时,共经过了多少米?第10次反弹多高?写出完整代码并给出解释并对代码作出注释第10次落 ...
- 小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0
C语言---求n的阶乘后面有多少个连续的0 题目描述:给定一个正整数n,返回n的阶乘尾部连续0的个数. 例如:(5,5*4*3*2*1=120,则返回1),(10,10*9*8*7*6*5*4*3*2 ...
- C语言——经典200道实例【基础例题100道——进阶例题100道】
目录: ===============================基础例题100道=============================== 1.输出 "Hello, World!& ...
最新文章
- centos python2.7升级到3.7_centos系统升级python 2.7.3
- mysql参数优化51cto_超详细MySQL数据库优化
- backbone js学习笔记之第三篇Model (续)
- cdh 添加jar包_使用maven下载cdh版本的大数据jar包
- python磁盘io_python监控磁盘io
- (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定...
- 台式机dp接口_精品导购:你想要的商务台式机 都在这里了!
- Redis面试 - Redis 主从架构
- 1月2日金象山滑雪(图片)
- Linux 命令(50)—— date 命令
- [html + css] SVG动画 发光渐变炫彩猫猫头
- scrapy 出现400 Bad Request 问题
- ubuntu16.04,exFAT格式U盘无法打开解决方式
- Windows7 打开任务计划提示“任务计划程序服务不可用。任务计划程序将尝试重新与其建立连接。”解决办法
- 江南农村商业银行容器云平台建设经验分享
- 熟知ghost参数 恢复系统没烦恼【xpghost】
- 【学习笔记】李宏毅2021春机器学习课程第6.2节:生成式对抗网络 GAN(二)
- c语言传感器串口通信,树莓派上使用C语言检测触碰传感器
- 用POI实现word转html,用到的jar包
- Arduino ESP32 flash数据存储结构