Description
有n位阶梯进制,当n=4时,有:
1=⎛⎝⎜⎜⎜0000000001⎞⎠⎟⎟⎟2=⎛⎝⎜⎜⎜0000000010⎞⎠⎟⎟⎟3=⎛⎝⎜⎜⎜0000000011⎞⎠⎟⎟⎟4=⎛⎝⎜⎜⎜0000000110⎞⎠⎟⎟⎟5=⎛⎝⎜⎜⎜0000000111⎞⎠⎟⎟⎟6=⎛⎝⎜⎜⎜0000001000⎞⎠⎟⎟⎟18=⎛⎝⎜⎜⎜0000111000⎞⎠⎟⎟⎟4321第i阶
阶梯进制的由来:
众所周知,小包包是个帅哥,并且十分追求完美,是个完美主义者。他善于思考,并且想把一切不美好的事物变得更加美好。大家都知道,一个十进制数转换成n位二进制数将变成一串长度为n的01串,例如当n=8时,有:
(2)10=(00000010)2(127)10=(01111111)2
小包包很早以前就觉得一长串0和1太不美观,一直希望能改变它,希望寄予天天向上的积极思想,因此小包包创造了一个由0和1组成的阶梯进制,它由n阶组成(由1阶到n阶逐级上升)。它遵循以下几条规则:
1. 当第1阶为0,该数加1时,第1阶置为1。
2. 每当第i(i≥2)阶的低阶(即第i−1阶)全为1,第i−1阶再获得1时,第i−1阶所有的1会置为0,并会向第i阶进1。
3. 所有1下方不会有0。(因为小包包认为该进制数寓意着人生,从低阶一步步加油努力,每一阶代表人生的一个阶段,因为踏踏实实走好每一步,所以基础很牢固,1就象征着那份努力,同学们也要像小包包一样好好学习呀!)
据说将若干个十进制数转换成该阶梯进制,就能获得小包包的嘉奖,来挑战一下吧!
Input
多组输入。
每组输入n和m。(1≤n≤18, 1≤m≤1000)
接下来m行,每行有一个十进制数a。(0≤a≤263−1)
Output
输出由n位阶梯进制表示的数a,若n位阶梯进制无法表示,则输出−1。
tips:行末无多余空格。
Samples
input Copy
4 1 2
output Copy
0
00
000
0010
input Copy
3 2 1 18
output Copy
0
00
001
1
10
100
//代码ac了的
#include <stdio.h>
#include <math.h>
/*
18 2
12345678912345678
*/
long long jc(int n);
void qk(int w[][30]);
void print(int w[][30],int n);
int w[30][30];
int main(void)
{
int n,m,k=20;
long long a,b;
while(scanf("%d %d",&n,&m)!=EOF)
{
while(m--)
{
scanf("%lld",&a);
qk(w);
k=20;
for(int i=1;i<=19;++i)//判断能到第几阶
{
if(jc(i)>a)
{
k = i - 1;
break;
}
}
if(k>n)//如果所需大于n就输出-1
{
printf("-1\n");
}
else//给w数组赋值,就是那些1
{
for(int i=k;i>=1;--i)
{
b=a/jc(i);
for(int j=n;j>n-b;j--)
{
w[j][n-i+1]=1;
}
a=a%jc(i);
}
print(w,n);//输出w数组
}
//if(m==0) printf("\n");
}
}
return 0;
}
long long jc(int n)
{
long long t=1;
for(int i=1;i<=n;++i)
{
t*=(long long)i;
}
return t;
}
void qk(int w[][30])
{
for(int i=1;i<30;++i)
{
for(int j=1;j<30;++j)
{
w[i][j]=0;
}
}
}
void print(int w[][30],int n)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=i;++j)
{
if(j==i)
printf("%d\n",w[i][j]);
else
printf("%d",w[i][j]);
}
}
}
//这道题关键是去寻找各个数的规律,然后去写代码,还是那句话就是先想好再写,还有就是以后有变量runtime,去观察一下赋值了没,题目不难关键在于找规律,加油