zoukankan      html  css  js  c++  java
  • 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、在算法中,这属于大数成绩,简单的思路就是从个位开始向高位计算,但是需要记录进位位。

  • 相关阅读:
    gulp编译sass
    Material Design学习
    js爬虫心得
    js爬虫
    angularjs
    sass心得
    矩阵与线性代数学习笔记
    2-SAT学习笔记
    一个有趣的题目【二分答案,2-SAT,线段树优化】
    vijos训练之——星辰大海中闪烁的趣题
  • 原文地址:https://www.cnblogs.com/jiashun/p/newcode17.html
Copyright © 2011-2022 走看看