AOJ-AHU-OJ-668 the Kth number

本文介绍了一种算法实现,用于求解经过特定规则筛选后的序列N10中的第k个数字,通过逐步删除序列中的元素来生成最终序列,并提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

the Kth number
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Description
定义序列N1 = {1, 2, 3, 4, 5, ..., 1000}(区间[1, 1000]内的所有整数);
从N1中每隔1个数删除1个数进而得到N2 = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, ..., 999};
从N2中每隔2个数删除1个数进而得到N3 = {1, 3, 7, 9, 13, 15, 19, 21, 25, ..., 999};
从N3中每隔3个数删除1个数进而得到N4 = {1, 3, 7, 13, 15, 19, 25, 27, ...};
...
从N9中每隔9个数删除1个数进而得到N10.
求出序列N10中的第k个数字的值.

Input
第1行: 一个数n;
第2行: n个数, 表示n个查询(数的范围为[1, 100]).

Output
一共n行,第i行对于第i个查询的答案。

Sample Input
Original Transformed
4
1 3 25 10

Sample Output
Original Transformed
1
7
223
79

Source
"讯飞输入法杯"安徽大学第六届程序设计竞赛
————————————————————忧桑的分割线————————————————————
思路:比赛的时候状态很差,我竟然二X得以为数组是连续的,不能删除!重新打一次表,直接用没有标记的点去覆盖不就行了!
代码如下:
#include <stdio.h>
int f[1000];
int main() {
    int i, j, k = 0;
    for(i = 0; i < 1000; i++)
        f[i] = i+1;
    int u = 1000;
    for(i = 1; i < 10; i++) { //一个循环得到N10
        for(j = i; j < u; j+=i+1)
            f[j] = -1;//在需要删除的点上做标记
        for(j = 0; j < u; j++)
            if(f[j] != -1)
                f[k++] = f[j];//从0开始到u更新表f[]
        u = k; k = 0;
    }
    int n, id;
    scanf("%d", &n);
    while(n--) {
        scanf("%d", &id);
        printf("%d\n", f[id-1]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值