#include <iostream> using namespace std; int n; int ans=1; int main(){ cin>>n; for(int i=1; i<=n ;i++){ ans*=i; while(ans%10==0)ans/=10; ans%=10000; } cout<<ans%10; return 0; }
你这才是老实人,我喜欢,给你点个赞
ans%=10000;
为什么这里改成
ans%=10;
就过不了呢?
因为可能存在末尾多个0的情况
我理解了,譬如1215的情况,%10相当于变成125,最后留下最后一位是6; 但实际情况应该留12*15=170,留7。 总的来说就是最后ans只留下最后一个非零的数是不够的
大佬,你说的是什么意思?可以解释一下吗
阶乘过程中的ans不能仅留一位有效位。 比如 此时 ans=12,仅留下一位有效位 ans=2,然后ans乘下一个数15,得到ans=30,再留一位得到3,但其实 ans=12*15=180,最后一位应该是是8; 总之我们要留足取模的位数,以满足进位的要求。
谢谢大佬
每次去零且只算后四位,我计算后三位也能ac
#### tql
你这才是老实人,我喜欢,给你点个赞
为什么这里改成
就过不了呢?
因为可能存在末尾多个0的情况
我理解了,譬如1215的情况,%10相当于变成125,最后留下最后一位是6;
但实际情况应该留12*15=170,留7。
总的来说就是最后ans只留下最后一个非零的数是不够的
大佬,你说的是什么意思?可以解释一下吗
阶乘过程中的ans不能仅留一位有效位。
比如 此时 ans=12,仅留下一位有效位 ans=2,然后ans乘下一个数15,得到ans=30,再留一位得到3,但其实 ans=12*15=180,最后一位应该是是8;
总之我们要留足取模的位数,以满足进位的要求。
谢谢大佬
每次去零且只算后四位,我计算后三位也能ac
#### tql