奇数单增序列

GitHub跳转原题关系图返回列表

遍历序列,用位运算筛出奇数,升序排序后以逗号分隔输出。

OJ: roj

题目 ID: 1177

难度:入门

标签:入门数组排序

创建: 2026-09-29 22:16

更新: 2026-10-05 04:25

题目描述

给定一个长度为 NN(N⩽500N \leqslant 500)的正整数序列,将其中的所有奇数取出,按升序输出。数据保证至少有一个奇数。

输入格式:第一行为 NN;第二行为 NN 个正整数。输出格式:增序输出的奇数序列,数据之间以逗号间隔。

样例输入:

text
10
1 3 2 6 5 4 9 8 7 10

样例输出:

text
1,3,5,7,9

思路

遍历序列,用 x & 1 判奇偶并保留奇数,再对保留的数升序排序,最后以逗号分隔输出即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-07-05 22:00
# update_at: 2026-07-05 22:00

import sys


def solve() -> None:
    data = iter(map(int, sys.stdin.buffer.read().split()))
    n = next(data)
    odds = sorted(v for _, v in zip(range(n), data) if v & 1)  # 只保留奇数并升序排序
    print(','.join(map(str, odds)))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 04:25
 * update_at: 2026-10-05 04:25
 */
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long ll;

const int MAXN = 505; // 序列最大长度

ll a[MAXN];      // 原序列
ll odd[MAXN];    // 筛选出的奇数
ll n, k;         // n 为长度,k 为奇数个数

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
        if (a[i] & 1) { // 二进制最低位为 1,表示奇数
            odd[++k] = a[i];
        }
    }

    sort(odd + 1, odd + k + 1); // 对奇数升序排序

    for (ll i = 1; i <= k; i++) {
        if (i > 1) cout << ',';
        cout << odd[i];
    }
    cout << '\n';

    return 0;
}