前言:
现时大家对“从键盘输入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的阶乘