按钮问题

题目

现有两个按钮,按下按钮0会执行2x+1,按下1执行2x+2。x初值为0,现要求出任意正整数n应使用何种按法使得x能变成n。

遍历

打眼一看这题就是遍历啊,找所有解法,但是不同于别的简单题,需要你有一个顺序去遍历。递归呗。使用深度优先搜索。
具体如下。

#include<stdio.h>
#include<stdlib.h>
int success;

int max(int s){
    int n = 0;
    int t = 0;
    while(t<s){
        t = t*2+1;
        n++;
    }
    return n;
}

void print(int arr[],int now){
    int i;
    for(i = 0;i<now;i++){
        printf("%d ",arr[i]);
    }
    puts("");
}

void do_sth(int arr[],int now,int t,int m,int type){

    //arr[]保存路径的数组
    //now 当前步数
    //t当前结果
    //m目标值
    //type 当前算法
    if(success == 1){
        return ;
    }
    if(t > m){
        return;
    }

    arr[now] = type;
    int new_t;
    if(type==0){
        new_t = t*2 + 1;

    }else{
        new_t = t*2 + 2;
    }
    if(new_t == m){
        success = 1;
        print(arr,now+1);
        return;
    }else{
        do_sth(arr,now+1,new_t,m,0);
        do_sth(arr,now+1,new_t,m,1);
    }
}

int main(void){
    success = 0;
    int n;
    int t;
    int *arr;
    while(scanf("%d",&n) != EOF){
        success = 0;
        t = max(n);
        arr = malloc(sizeof(int)*t);
        do_sth(arr,0,0,n,0);
        do_sth(arr,0,0,n,1);
                free(arr);
    }
}

逆向求解

因为这道题每个要求解的数的答案都是固定的,dfs遍历太耗费时间。实际可以通过以下方法求解。
1. n大于0吗?是——>2。否——>逆序输出结果
2. n是奇数吗?是——>3。否——>4
3. n=(n-1)/2 记录按钮0 ——>1
4. n=(n-2)/2 记录按钮1 ——>1
python代码

#! /usr/bin/env python3

def solve(n):
    s = []
    while(n>0):
        if(n % 2 == 1):
            n = (n-1)/2
            s.append(0)
        else:
            n = (n-2)/2
            s.append(1)

    for i in s:
        print('{} '.format(i),end='')
    print("")

try:
    while True:
        s = int(input())
        solve(s)

except EOFError:
    pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值