筷子与饺子

My Links

Blog Stats

N的阶乘 -- 牛客

题目描述

 输入一个正整数N,输出N的阶乘。

输入描述:

正整数N(0<=N<=1000)

输出描述:

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1

输入

4
5
15

输出

24
120
1307674368000

解题思路

这并不是一道简单的求N阶乘的题目,一般来说求阶乘的方法有俩种:第一直接利用循环求解。第二是使用递归进行求解
但是在这里若是简单的使用以上的俩种方法将会导致内存不够。
所以,我们需要采用大数乘法的方式进行求解:
1、利用一个数组对结果按个位、十位、百位...进行存储。
2、对于阶乘,采用按位相乘的原则。首先建立i从1到 N 的循环,再从个位开始与i相乘,并且用一个进位位carry记录上一次相乘的进位。
3、记录下来当前乘法结果的位数,每一次内循环只需要依次计算当前结果的位数的长度。
4、以每4位为一个单位进行存储。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdio.h>
 4 using namespace std;
 5 #define max 10000
 6 int main()
 7 {
 8     int N;
 9     long res[max] = {0}; //利用长数组来存放结果
10     while(cin >> N)
11     {
12         int i,j,carry = 0,bit = 0; //分别记录进位位和当前结果的位数
13         res[0] = 1;
14         for(i=1;i<=N;i++,carry=0)
15         {
16             for(j = 0;j<=bit;j++)
17             {
18                 res[j] = res[j]*i + carry;
19                 carry = res[j]/10000;
20                 res[j] = res[j]%10000;
21             }
22             if(carry)
23                 res[++bit] = carry; //处理新的进位
24         }
25           for(printf("%ld",res[i=bit]);i;printf("%.4ld",res[--i])); //从高位开始输出
26               cout<<endl;
27 
28     }
29 }

 

summary

1、在算法中,这属于大数成绩,简单的思路就是从个位开始向高位计算,但是需要记录进位位。

posted on 2019-08-19 16:03 筷子与饺子 阅读(...) 评论(...) 编辑 收藏