用十进制计算30!(30的阶乘),将结果转化成3进制进行表示的话,该进制下的结果末尾会有多少个0?

来源:互联网 发布:淘宝可以直邮韩国么 编辑:程序博客网 时间:2024/04/29 21:04
如何是小阶乘的话,可以使用这个算法:
#include<stdio.h>int main(){int n;int i;int sum;printf("请输入阶乘:");scanf("%d",&n);printf("请输入要换算的进制:");scanf("%d",&i);sum=fun(n);printf("阶乘为:%d\n",sum);fun1(sum,i);return 0;}int fun(int n){if(n==1)return 1;elsereturn n*fun(n-1);}int fun1(int n,int i){int count=0;int j=-1;int a[1280]={0};while(n!=0){a[++j]=n%i;n=n/i;}printf("%d进制为:",i);for(j;j>=0;j--){printf("%d",a[j]);count++;if(count%4==0)printf(" ");if(a[j]!=0)count=0;}printf("一共有%d个0\n:",count);}

根据规律,看1-30里面含有多少3的倍数,3,6,12,15,21,24,30 每个数含有1个3,  9,18,还有2个3,    27 还有3个3  ,一共14个3。 因为进制相当与乘除,所以后14位一定会进制为0,代码如下:


#include<stdio.h>int main(){int m,n;int i,j,count=0;printf("请输入您的阶乘:");scanf("%d",&m);printf("请输入您的进制:");scanf("%d",&n);for(i=1;i<=m;i++){if(i%n==0)printf("\n产生数:%d\n",i);for(j=i;j%n==0;j=j/n){printf("%d\t",j);count++;}}printf("\n%d进制末尾0的个数为%4d个\n",n,count);return 0;}

运行结果:

请输入您的阶乘:30请输入您的进制:3产生数:33产生数:66产生数:993产生数:1212产生数:1515产生数:18186产生数:2121产生数:2424产生数:272793产生数:30303进制末尾0的个数为  14个


0 0
原创粉丝点击