每日一算法:大数的阶乘
【摘要】 由于int有其本身的范围,所以,求阶乘很容易溢出
为此
我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1 1*2 = 2; a[0] = 2; 2*3 = 6; a[0] = 6; 6*4 = 24; a...
由于int有其本身的范围,所以,求阶乘很容易溢出
为此
我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1
1*2 = 2; a[0] = 2;
2*3 = 6; a[0] = 6;
6*4 = 24; a[0] = 4,a[1] = 2;
24 * 5 = 120 a[0] * 5 = 20,2进位,a[0] = 0, a[1] * 5 = 10,1进位,a[1] = 0+2 = 2; a[2] = 2;
120*6 = 720 a[0] * 6 = 0,a[0] = 0, a[1] * 6 = 12,1进位,a[1] = 2; a[2] * 6 = 6,在加上进位的1,也就是a[2] = 6+1 = 7
后面一样....................................................................
为此,我们需要两个循环,从1....n,n的阶乘
存储结果后的数组有多少位参与运算,1....total
还需设置一个进位标志flag。
-
#include <stdio.h>
-
-
char per[1000000]; /*保存结果的每一个位*/
-
int total; /*结果的位数*/
-
-
void fact(int num)
-
{
-
int i,j,flag,temp; /*flag是进位标志*/
-
per[0] = 1;
-
total = 1;
-
for (i=1,flag = 0; i<=num; i++)
-
{
-
for (j=0,temp = 0; j<total; j++)
-
{
-
temp = per[j] * i + flag; /*数组的每一位与i相乘*/
-
per[j] = temp % 10; /*每一位小于10*/
-
flag = temp / 10; /*所进的位数*/
-
}
-
while (flag)
-
{
-
per[total] = flag % 10;
-
total++;
-
flag = flag / 10;
-
}
-
}
-
}
-
-
int main()
-
{
-
int i, number;
-
printf("Please input a number:");
-
scanf("%d",&number);
-
fact(number);
-
printf("%d! = ",number);
-
for (i=total-1; i>=0; i--)
-
{
-
printf("%d",per[i]);
-
}
-
-
printf("\n一共%d位!\n",total);
-
-
return 0;
-
}
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/13004333
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)