NowcoderGirl編程比賽(二)

上一篇博客中提到的是編程比賽的第一道題,還是比較容易的。第二道題就相對來說有些不容易想了。

題目要求(大概):

現有兩個按鈕,按下按鈕N會執行2x+1,按下M執行2x+2。x初值爲0,現要求出任意正整數n應使用何種按法使得x能變成n。

解法一:

我們猜想,是否任意給定一個數字都可以得通過按不同的按鈕得到。可以使用窮盡法試試,便可以發現其中的規律。其實是可以通過任意一個數字找出其的順序。那麼我們可以倒着想:

  • 如果n爲偶數且n不等於0,則 按下了M ,執行 n = (n-2)/2;
  • 如果n爲奇數,則按下了N ,執行 n = (n-1)/2;
  • 如果n爲0,則逆序輸出按下的按鈕。

C語言實現:

#include <stdio.h>
int max(int a);
int min(int a);
int main(void){
    int value;
    scanf("%d",&value);
    char ch[2000];
    int flag = 0;
    int k = 0;
    while (value > 0){
        if(value %2 == 0){
            value = max(value);
            ch[flag] = 'G';
            flag++;
        } else{
            value = min(value);
            ch[flag] = 'N';
            flag++;
        }
    }
    while (flag > 0){
        printf("%c",ch[flag-1]);
        flag--;
    }
}

int max (int a){
    int temp = (a-2)/2;
    return temp;
}

int min (int a){
    int temp = (a-1)/2;
    return temp;
}

解法二:

上面提到了如果用窮舉法有規律,其實就是一個滿二叉數,我們需要做的就是遞歸遍歷,用深度優先搜索便可以解決問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章