龙空技术网

C++基础算法:求10000以内n的阶乘

陪儿学信息学奥赛 164

前言:

现时大家对“从键盘输入n计算n的阶乘”大概比较注意,看官们都想要了解一些“从键盘输入n计算n的阶乘”的相关资讯。那么小编在网摘上搜集了一些关于“从键盘输入n计算n的阶乘””的相关资讯,希望看官们能喜欢,各位老铁们快快来了解一下吧!

【题目描述】

求10000以内n的阶乘。

【输入】

只有一行输入,整数n(0≤n≤10000)。

【输出】

一行,即n!的值。

【输入样例】

4
【输出样例】
24
解题思路

一开始(方法一)我采用了基础算法-高精度乘法的逻辑,循环n,将乘数n拆解成每一位与被乘数相乘,虽然逻辑正确,但是提交时,有几个测试用例提示时间和内存超限制。

方法二就是基础算法-高精度乘法的升级版,不对乘数进行拆解,而是将被乘数的每一位乘乘数,从而算的最后的结果。具体逻辑请查看代码注释。

参考答案

方法一(此方法超时):

#include <vector>#include "iostream"using namespace std;vector<int> deal(vector<int> vct, int n) {    int mod = n % 10;    n = n/10;    int i = 0;    vector<int> result(vct.size()*2,0);    do{        int carry = 0;        for(int j=0;j<vct.size();j++){            result[j+i] = result[j+i] + vct[j] * mod + carry;            carry = result[j+i] / 10;            result[j+i] %= 10;        }        i++;        mod = n % 10;        n = n/10;    } while (n != 0 || mod != 0);    return result;}int main(){    int n;    cin>>n;    if(n<2){        cout<<n<<endl;    }    vector<int> vec  = {1};    for(int i=2;i<=n;i++){        vec = deal(vec, i);    }    int end = vec.size()-1;    while (vec[end]==0){        end--;    }    for(int i=end;i>=0;i--){        cout<<vec[i];    }    cout<<endl;    return 0;}

方法二:

#include<iostream>using namespace std;//存储结果int a[36000] = {0,1};int main(){    int n;    cin>>n;    //结果长度    int l = 1;    //注意:0!=1    //从1~n,循环乘结果a的每一位(例如,当前i=33,结果a=123,是将123的每一位都×33,然后处理进位,得到当前循环后的结果a)    for(int i=1; i<= n; i++){        //对结果a的每一位×i        for(int j=1; j<=l; j++){            //当前位×i            a[j] = a[j]*i;            //当前位的实际值需要+上一位的进位            a[j] = a[j-1]/10+a[j];            //上一位进位后,就只需要保留余数即可,也就是该位实际应该的值            a[j-1] = a[j-1]%10;            //如果当前位的值>10,而且j>=结果长度l,说明结果需要进位,需要将结果长度l+1,将当前位向高位进位(也就是继续执行当前for循环)            if(a[j]>=10 && j>=l) {                l++;            }        }    }    //从结果长度l位倒叙输出结果到1的位置(去除0位置的0)    for(int i=l; i>=1; i--){        cout<<a[i];    }    return 0;}

标签: #从键盘输入n计算n的阶乘 #求n的阶乘n从键盘输入 #求n的阶乘流程图 #c输入整数n求n的阶乘 #输入正整数n求n的阶乘