小包包的进制转换

这篇博客介绍了一种名为阶梯进制的新型数制,由完美主义者小包包创造,旨在使01串更美观。阶梯进制遵循特定规则,如第1阶满后进1,低阶全1时向高阶进1等。文章提供了输入输出示例,并展示了一个C语言实现的转换算法,用于将十进制数转化为阶梯进制。
摘要由CSDN通过智能技术生成

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,去观察一下赋值了没,题目不难关键在于找规律,加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值