2302_80049229 2023-10-03 22:51 采纳率: 50%
浏览 16
已结题

找一下报错原因,纠正一下

C语言
代码报错但是系统并没有显示(加粗)报错的地方,而且输入1,2,3程序能算出正确答案,4以后就不行了

img

img

  • 写回答

5条回答 默认 最新

  • 忧伤的玩不起 2023-10-04 08:32
    关注

    这个题目没有这么简单的,其实算到4!!的时候,数据已经爆了,因为24!数非常大,按正常算法算不出来的.需要特别处理的算法,我们知道末尾为0的前提条件是2*5相乘,我们只需要把所有乘数分解只需要提取N个2和M个5相乘即可,根据数值分析知道,2的个数远远大于5的个数,所以我们只需要求5的个数就可以了。源码如下:

    #include <stdio.h>
     
    __int64 fact(int n);
    void faceEx(int *count_5, __int64 guodu);
    int main(void) {
        int n,i;
        __int64 guodu;
        int count_5=0;
        scanf("%d", &n);
        for(i = 1; i <= n; i++) {
            guodu = fact(i);
            faceEx(&count_5,guodu);
        }
        printf("%d", count_5);
        return 0;
    }
     
    __int64 fact(int n) {
        int i;
        __int64 product;
        product = 1;
        for (i = 2; i <= n; i++) {
            product = product * i;
        }
        return product;
    }
    
    void faceEx(int *count_5, __int64 guodu){
        __int64 i,temp;
        for(i=5;i<=guodu;i++){
            temp = i;
            while(temp%5==0){
                (*count_5)++;
                temp = temp /5;
            }
        }
    }
    

    其实代码还有点问题,就像前面的问题一样face大于超过数据类型值的上限我们就会错误,上面公式只能求到20!即n<=20,超过20也会报错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月4日
  • 已采纳回答 10月4日
  • 专家修改了标签 10月3日
  • 修改了问题 10月3日
  • 展开全部