n个小孩围城一圈数数,数到 2^k, 就退出圈子。07年 C 语言最后一道![专硕]@NEU

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct Node {
    int value;
    Node* next;
};
int n;
Node* creatList(Node* &head, int n) {
    Node* p = head;
    for(int i = 2; i <= n; i++) {
        Node* temp = new Node();
        temp->value = i;
        p->next = temp;
        p = p->next;
    }
    p->next = head;
    return p;
}
void del(Node* x) {
    Node* temp = x->next;
    x->next = temp->next;
    delete temp;
    temp = 0;
}
bool flag(int k) {
    if(!((k+1) & k)) {
        return true;
    }
    return false;
}
int main() {
    while(cin >> n) { /// n >= 1;
        Node* root = new Node();
        root->value = 1;
        Node* tail = creatList(root, n);
        Node* p = tail;
        int k = 0, cnt = 0;
        while(p) {
            if(flag(k)) {
                cout << p->next->value << ' ';
                del(p);
                cnt++;
            }
            else {
                p = p->next;
            }
            ++k;
            if(cnt == n) {
                cout << endl;
                break;
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值