本文主要是介绍XTU-OJ 1150-n!进制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
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
解题思路:本题一看题,又是一个进制转换的题目。使得 n(十进制) = an an-1 ······ a1 a0(p进制).
但是注意,这个题又和普通的 p 进制转换不一样,普通 p 进制转换的方法: ai = n%p , n/=p。 而这题进制是随位数在变化,ai 不再是通过模运算得到,而是直接等于除运算的 商 。
因为普通p进制的算法是 n = an*p^n-1 + an-1*p^n-2 +·····+ a1*p + a0*1 。 而 n!进制 n = an*(n+1)! + an-1*(n)! +·····+ a1*2! + a0*1!。 一个是指数求和的逆运算,一个是乘法求和的逆运算。
再好的解释都没有一个例子来的生动,大家找个数,模拟一下,就能很容易明白了。
AC代码:
#include <stdio.h>int base[20]= {0,1};
int main()
{for (int i = 2; i <= 10; i ++) // 计算 n!base[i] = base[i-1]*i;int n,t,s;while (scanf("%d",&n) != EOF){if ( n == 0 ) {puts("0"); continue;} for (t = 1; base[t+1] <= n; t ++); // 找到最接近的进制,从最大的开始while (n){for ( ; t >= 1; t --){s = n/base[t];printf("%d",s);n %= base[t]; }}puts("");}return 0;
}
这篇关于XTU-OJ 1150-n!进制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!