2019年3月19日,我参加了学校和各企业一起办的双选会。本来我是打算再考一年的,不过我觉得如果能先尝试一下工作也很不错鸭。
今天面试官问了我一道题:100的阶乘后面有多少个0?
我刚听到的时候有点懵懵的,还以为他问我那个数有多大,被阶乘的巨大结果瞬间支配,甚至还想到了对数求解的方法。结果面试的小哥哥说这道题用数论的方法很简单的。
我一拍脑门,求多少个0不就是有多少个10吗,那5,15,25,...,100不就是答案了嘛,然后我就回答了20个,啊,我的脑子啊!
这个很明显应该看因数里有多少个2X5嘛,因为2是足够多的,所以看因数里面5的个数就好啦,25的倍数里面5有两个,所以是20+4=24个。
对,没错,就是这么简单的题,哭辽,数学思维被小笼包侵占了。
后记
2020年4月15日,大数阶乘用字符串相乘也可
#include<iostream> #include<stdio.h> #include<cmath> #include<cstring> #include<vector> using namespace std; string multiply(string num1, string num2) { if(num1=="0"||num2=="0")return "0"; vector<int> ans; ans.push_back(0); int z=0; for(int i=num2.size()-1;i>=0;i--) { int a=num2[i]-'0'; int c=0,tag=z; for(int j=num1.size()-1;j>=0;j--) { int b=num1[j]-'0'; if(tag>ans.size()-1){ ans.push_back(0); } int tmp=ans[tag]; ans[tag]=(b*a+c+ans[tag])%10; tag++; c=(b*a+c+tmp)/10; } if(c!=0)ans.push_back(c); z++; } string str=""; for(int i=ans.size()-1;i>=0;i--) str+=(ans[i]+'0'); return str; } int main(){ string res="1"; for(int i=1;i<=100;i++){ res=multiply(to_string(i),res); } cout<<res<<endl; return 0; }
//93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000