算法1
思路:因为0只可能由2的倍数和5的倍数相乘得到,所以在进行乘法的过程中,我们将2和5的倍数给清理掉,这样就保证了不会出现0,然后我们控制其范围,每次相乘取其个位,因为个位肯定是非零元素,十位以后的数字完全没有必要保留下来,最后,我们将多处理的2或者5重新乘回去再取余即可。
C++ 代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int res=1,d2=0,d5=0;
for(int i=1;i<=n;i++)
{
int x=i;
while(x%2==0)x/=2,d2++;//把所有2除干净
while(x%5==0)x/=5,d5++;//把所有5除干净
res=res*x%10;//得到个位,因为个位不可能为0了
}
int k=min(d2,d5);
for(int i=0;i<d2-k;i++)res=res*2%10;//把多余的2乘上去
for(int i=0;i<d5-k;i++)res=res*5%10;//把多余的5乘上去
cout<<res<<endl;
return 0;
}