题目:
输入不超过1000的正整数N,输出N!=1x2x3x4……xN的精确结果
样例输入:30
样例输出:265252859812191058636308480000000
思路:由于数值过大,无法用任何类型的将其保存,故使用乘法的基本算式求解。
样例输入:30
样例输出:265252859812191058636308480000000
思路:由于数值过大,无法用任何类型的将其保存,故使用乘法的基本算式求解。
例子:
用一个len去记录当前的结果有多少位,每次用已经存储(用大数组存储)的数的每一位去乘以需要乘的值,然后用相乘所得的值与进位值相加然后再取10的余数取更新当前位置的值。 直到最后一位乘了以后如果进位值不为0继续往上进位。
比如上图中说第一次进行
5 X 3 = 15 进位值默认为0 则(15 + 0)%10获得的值去更新当前位置的值 5 更新为 5
最后一次后 3 更新为 0 ,检测到进位值不为0,则进位。
以下为代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int main()
{
int n;//定义n
while(scanf("%d",&n) != EOF)//循环输入
{
int ans[100000] = {1,0},size = 1,carry = 0;//定义并且初始化所有需要的值
for(int i = 2;i <= n;i++)//从2到当前需要阶乘的值
{
for(int j = 0;j < size;j++)//遍历所有已经有的值
{
int temp = ans[j]*i + carry;//用已经有的每个值去乘数并且加上进位
ans[j] = temp%10;//除去进位后的是当前位置上的数
carry = temp/10;//用除以10 求得应该进多少位
}
while(carry != 0)//只要进位的值不等于0
{
ans[size++] = carry % 10;//最大值进位
carry /= 10; //进位后进位值变小
}
}
for(int i = size - 1;i >= 0;i--)//倒序遍历
{
printf("%d",ans[i]);//输出数组里的每个值
}
}
return 0;//结束主函数
}