【FOJ】Problem 1449 Skew Binary

Problem 1449 Skew Binary.

题意

在这里插入图片描述

  • 把数字用对应的等级进制表示,如果该为数字为2则需要输出两次该位的等级(避免和等级2重复)
    Note that this means that only the first two ranks in the list may be equal
    (因为后面都是输出的等级/包括等级2,只有在最低等级会出现n/weight=2的情况,最低位出现2,则输出两次等级)
    比如:
    1 = 1/1(0)【0】
    2 = 2/1(0,2)【0,0】
    3 = 3/3(1)【1】
    4 = 4/3(1,余1) + 1/1(0)【0,1】
    5 = 5/3(1,余2) + 2/1(0,2)【0,0,1】
    6 = 6/3(1,2)【1,1】
    27 = 27/15(3,余12) + 12/7(2,余5) + 5/3(1,余2) + 2/1(0)【0,0,1,2,3】
  • 输入:
    测试数t(1-10)
    t行十位数字,范围0…100663270
    自己测了一下,范围内数字的最高等级 i 是25(227=134217728, 226=67108864,2i+1-1)
  • 输出:
    数字 [对应的等级列表]
    0 []
    1 [0]
    2 [0,0]
    3 [1]
    4 [0,1]

思路

  • 先用数组把每个等级对应的权重储存起来,weight[27];ans[30]存放输入数字对应的等级序列
  • i = 26,对每个输入的数字从后往前遍历权重数组:
    如果 n/weight[i] > 0:
    ans[len++] = i
    如果 i == 0 && n/weight[i]==2:ans[len++] = 0
    n = n%weight[i]
  • 逆序输出

代码

#include<cstdio>
#include<cmath>

int weight[30], ans[30];
int len;

void init_weight(){
    for(int i=0; i<=25; i++)
        weight[i] = pow(2.0, (double)(i+1)) - 1;
}

int main(){
    init_weight();
    int t, n, temp_n, temp;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        len = 0;
        temp_n = n;
        for(int i=25; i>=0; i--){
            temp = temp_n/weight[i];
            if(temp > 0){
                ans[len++] = i;
                temp_n = temp_n%weight[i];
            }
            if(temp_n==0 && temp==2){   //最低位且除完等于2
                ans[len++] = i;
                break;
            }
        }
        printf("%d [", n);
        for(int i=len-1; i>=0; i--){
            printf("%d", ans[i]);
            if(i!=0)
                printf(",");
        }
        printf("]\n");
    }
    return 0;
}
发布了46 篇原创文章 · 获赞 0 · 访问量 461

猜你喜欢

转载自blog.csdn.net/qq_44531167/article/details/105475983