计算n!的十进制表示最后有多少个0

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24964575/article/details/53953958

简单实现:

#include<stdio.h>
#include<stdlib.h>
int fun(int n)
{
    int num = 0;
    int i,j;
    for (i = 5;i <= n;i += 5)
    {
        j = i;
        while (j % 5 == 0)
        {
            num++;
            j /= 5;
        }
    }
    return num;
}

int main()
{
    int n;
    int *temp;
    printf("请输入将要输入数据的组数:");
    scanf("%d",&n);
    temp = (int *)malloc(sizeof(int) * n);
    while(getchar() != '\n') continue;
    printf("\n请输入 %d 个测试数据!\n\n",n);
    for(int i=0;i<n;i++)
    {
        printf("请输入第%d个数:",i);
        scanf("%d",&temp[i]);
        while(getchar() != '\n') continue;
    }
    printf("\n");
    for(int i=0;i<n;i++)
    {
        printf("第%d个数处理结果:",i);
        printf("%d\n",fun(temp[i]));
    }
    return 0;
}

这里写图片描述

复杂实现:

/*
根据题目要求,程序需要得到一个任意数的阶乘十进制结果中的0的个数
解题思路如下:
1.首先实现获得一个任意数阶乘的二进制结果的程序
2.根据步骤一得出的二进制结果(二进制数存
储的数组中)计算出相应十进制结果中0的个数
------------------------------------
这个程序实现了步骤一的一个简版:

①该程序的思想是借鉴原码一位乘的算法

②第二部可以通过源码一位除实现,我就不再实现了

PS:若想实现任意数的乘法运算,可以提供的思路是将数组存储方式改
为链表存储方式。注意:要看懂这个代码,请先理解原码一位乘的思想
【参考书籍:《计算机组成原理》《汇编语言》等书籍】
*/
#include <stdio.h>
#include <stdlib.h>

#define N  5

int main()
{
    int C = 0;             //进位寄存器
    int P[N] = {0,0,0,0,0};//部分积寄存器
    int B[N] = {0,0,0,0,0};//中间值寄存器
    int X[N] = {1,1,0,1,1};//被除数寄存器     -->十进制是27
    int Y[N] = {1,1,1,1,1};//乘数寄存器       -->十进制是31
    int y[N] = {1,1,1,1,1};//乘数移位寄存器
    int BN[N*2];           //存储最后乘法的二进制结果   11111B * 11011B = 1101000101B
    int i,j,temp;          //临时变量
    long long num = 0;     //存储最后乘法的十进制结果   27D * 31D = 837D
    for(i=0;i<N;i++)//原码一位乘的位数N
    {
        for(j=0;j<N;j++)//获得中间值B
        {
            B[j] = Y[i]*X[j];
        }
        for(j=N-1;j>=0;j--)//获得部分积P
        {
            temp = P[j] + B[j] + C;
            if(temp == 2)
            {
                P[j] = 0;
                C = 1;
            }
            else if(temp == 3)
            {
                P[j] = 1;
                C = 1;
            }
            else
            {
                P[j] = temp;
                C = 0;
            }
            temp = 0;//缓存清零
            B[j] = 0;//缓存清零
        }
        //CPY同时右移
        temp = P[N-1];
        for(j=N-2;j>=0;j--)
        {
            P[j+1] = P[j];
            y[j+1] = y[j];
        }
        y[0] = temp;
        P[0] = C;
        C = 0;
    }
    //输出乘法的二进制结果
    printf("等价运算:11111B * 11011B = 1101000101B\n");
    printf("原码一位乘二进制结果:");
    for(i=0;i<N;i++)
    {
        printf("%d",P[i]);
        BN[i] = P[i];
    }
    for(i=0;i<N;i++)
    {
        printf("%d",y[i]);
        BN[i+N] = y[i];
    }
    printf("\n\n");
    //输出乘法的二进制结果
    printf("等价运算:11111B * 11011B = 1101000101B\n");
    printf("原码一位乘二进制结果:");
    for(i=0;i<2*N;i++)
    {
        printf("%d",BN[i]);
    }
    printf("\n\n");
    //输出二进制转十进制结果
    printf("等价运算:27D * 31D = 837D\n");
    printf("原码一位乘十进制结果:");
    for(i=N-1;i>=0;i--)
    {
        temp = 1;
        for(j=N-1-i;j>0;j--)
        {
            temp = temp * 2;
        }
        num = num + temp * y[i];
    }
    for(i=N-1;i>=0;i--)
    {
        temp = 1;
        for(j=N-1-i;j>0;j--)
        {
            temp = temp * 2;
        }
        for(j=0;j<N;j++)
        {
            temp = temp * 2;
        }
        num = num + temp * P[i];
    }
    printf("%d\n\n",num);
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_24964575/article/details/53953958
今日推荐