版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}