n! 末尾0的个数

笔试题——n! 末尾0的个数

最近做了百姓网的一个笔试题,美国服务器,香港服务器,题目是求n! 末尾0的个数;

个数 n 的阶乘末尾有多少个 0 取决于从 1 到 n 的各个数的因子中 2 和 5 的个数, 而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可. 题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0, 然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0, 则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个, 即 100 的阶乘末尾有 24 个 0. 其实不断除以 5, 是因为每间隔 5 个数有一个数可以被 5 整除, 然后在这些可被 5 整除的数中, 每间隔 5 个数又有一个可以被 25 整除, 故要再除一次, … 直到结果为 0, 表示没有能继续被 5 整除的数了.

我的代码是:

#include<iostream>using namespace std;

//合法性判断函数/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bool Check(float k){ if((k-(int)k)<-0.000001|| (k-(int)k)>0.00001) {cout<<“必须输入整数”<<endl;return 0; } if(k<=0) {cout<<“输入的数字必须为正数”<<endl;return 0; } return 1;}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////求正整数n中因子5的个数函数int Count_zero(float n){ int temp = 1; int count = 0; while(0 != temp) {temp = n/5;count += temp;n = temp; }/*int count = 0; for(int i=5;i<=n;i=i*5) {count += n/i;cout<<count<<endl; }*/ return count;}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int main(void){ float n = 0;//要输入的数n int num = 0;//n!末尾0的个数 do{cout<<“请输入n”<<endl;cin>>n; } while( 1 != Check(n) );//判断输入数字n的合法性 num = Count_zero(n);//求n!末尾0的个数 cout<<n<<“!末尾的0的个数是:”<<num<<endl;}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

总结:现在很多笔试题都是在《编程之美》上面的题,找工作前此书必看。再推荐一本书就是《C++高质量编程》。。。

posted on

,香港服务器生活中若没有朋友,就像生活中没有阳光一样

n! 末尾0的个数

相关文章:

你感兴趣的文章:

标签云: