26 阶乘最后的非0位
问题描述 :
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。
输入说明 :
一个不大于1000的整数N。
输出说明 :
共一行,输出N!最后面的非零位。
输入范例 :7
输出范例 :4
思想:常规思想会超时,参考了一个博主的写法,在每次阶乘后,如果为位数为0的整数,那么将其除10,直到不为整数为止,因为末尾的0并不参与后续有效运算,同时,对其计算规模加以限制,只取后4位进行阶乘,如果超过4位数,前面的直接取余去除,高位并不影响低位的计算。
#include <stdio.h> int main(){ int a; int i; scanf("%d",&a); long s; for(i=2;i<=a;i++){ s*=i; while(s%10==0){ s/=10; } s %=1000; } s%=10; printf("%ld",s); return 0; }

浙公网安备 33010602011771号