题目描述
n!进制是指每i位的权值是(i+1)!,每一位的系数为0~i+1。 比如n!进制的21 = 2*2! + 1*1! = 5。给你一个10进制数,求其n!进制的值。
输入
每行一个10进制的整数n,0≤n≤3,628,799。
输出
每行输出一个样例的结果。
样例输入
0 1 10 100 3628799
样例输出
0 1 120 4020 987654321
AC代码
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
if(n<0)break;
if(n==0)printf("0\n");
else if(n==1)printf("1\n");
else{
int a[20]={0,1};//存放阶乘n!
int i;
for(i=2;i<=15;i++){
a[i]=a[i-1]*i;//递归思想
}
int max;
int j=1;
while(a[j]<=n){//找n!进制最高位,注意此处有等号
j++;
}
max=j-1;
for(i=max;i>0;i--){
int t=n/a[i];
printf("%d",t);
n%=a[i];
}
printf("\n");
}
}
}
解题思路:首先我们要理解题目的意思,比如10=1*3!+2*2!+0*1!=6+4,输出120。100=4*4!+0*3!+2*2!+0*1!=96+4,输出4020。可以发现n!进制的最高位等于n除以最大阶乘数。参考传统10进制转b进制思路:a[i]=n%b,n/=b;再考虑对n取模,10%3!=4,4/2!=2正好是A2的值。规律:t=n/b,n%=b(这里的b表示阶乘b!)