#include <stdio.h>
/**
* 打印 [0-1000] 的阶乘
* 1000的阶乘大概2000-3000位,定义a[3000],用数组的每一位存储结果的每一位数字
* 在给数组赋值时,每一位的求法 和 乘法的列竖式计算 一样
* 从个位向高位乘,并伴有进位值,从低到高更新每一位的数字
*/
void printFactorial(int n) {
if (n < 0 || n > 1000) {
printf("Invalid input\n");
return;
}
int a[3000] = {0}; // 一定要初始化数组为0,理解为高位数字目前为0
a[1] = 1; // 1的阶乘
int len = 1; // 初始1的阶乘数字长度为1
for (int i = 2; i <= n; ++i) {
int carry = 0; // 进位 初始为 0
// j = 1..len 从个位到最高位依次 *i 并加上下一位的进位 carry
for (int j = 1; j <= len; ++j) {
int tmp = a[j] * i + carry;
a[j] = tmp % 10; // 更新当前位 * i 之后的值
carry = tmp / 10; // 低位向高1位的进位
// 如果最高位 a[len] *i + carry 的进位不为0,len+1,多循环一次
// 初始化时a[len+1]=0,循环后变为 carry
if (j == len && carry != 0) len++;
}
}
// %4d 对齐
printf("len = %4d\t\t", len);
printf("%4d! = ", n);
// 高位到低位 打印结果
for (int i = len; i >= 1; --i) {
printf("%d", a[i]);
}
printf("\n");
}
int main() {
for (int i = 0; i <= 1000; ++i) {
printFactorial(i);
}
}
打印 0-1000 的阶乘
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 今天在画表格时使用self.view.frame.size.width来确定Label的宽度,发现整个Label超...
- 最近在升级iOS10和Xcode8后出现了一个奇怪的问题,在所有使用autolayout的自定义视图中,在计算控件...