UVA10935 Throwing cards away I【模拟+queue+循环队列】

Given is an ordered deck of n cards numbered 1to n with card 1 at the top and card n at the bottom. The following operation is performed as long as there are at least two cards in the deck:

        Throw away the top card and move

        the card that is now on the top of the

        deck to the bottom of the deck.

  Your task is to find the sequence of discarded cards and the last, remaining card.


Input

Each line of input (except the last) contains a number n ≤ 50. The last line contains ‘0’ and this line should not be processed.

Output

For each number from the input produce two lines of output. The first line presents the sequence of discarded cards, the second line reports the last remaining card. No line will have leading or trailing spaces. See the sample for the expected format.

Sample Input

7

19

10

6

0

Sample Output

Discarded cards: 1, 3, 5, 7, 4, 2

Remaining card: 6

Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14

Remaining card: 6

Discarded cards: 1, 3, 5, 7, 9, 2, 6, 10, 8

Remaining card: 4

Discarded cards: 1, 3, 5, 2, 6

Remaining card: 4


问题链接UVA10935 Throwing cards away I

问题简述:(略)

问题分析:(略)

程序说明

  这是一个模拟问题,直接使用队列(queue)来模拟即可。

  然而,效率更高的做法是,自己构建一个循环队列来实现模拟。需要注意的是,那个队列的存储单元至少要比最大值大1,否则会出现下标异常。

题记:(略)

参考链接:(略)


AC的C语言程序如下:

/* UVA10935 Throwing cards away I */

#include <stdio.h>

#define N (50 + 1)
int cq[N], headcq, tailcq;

void pushcq(int v)
{
    cq[tailcq++] = v;
    tailcq %= N;
}

void popcq()
{
    headcq++;
    headcq %= N;
}

int frontcq()
{
    return cq[headcq];
}

int sizecq()
{
    return (tailcq + N - headcq) % N;
}

void initcq()
{
    headcq = tailcq = 0;
}

int main(void)
{
    int n, i;

    while(~scanf("%d", &n) && n) {
        initcq();

        for(i=1; i<=n; i++)
            pushcq(i);

        printf("Discarded cards:");

        int nofirst = 0;
        while(sizecq() >= 2) {
            if(nofirst)
                printf(",");
            nofirst = 1;

            printf(" %d", frontcq());

            popcq();
            pushcq(frontcq());
            popcq();
        }
        printf("\nRemaining card: %d\n", frontcq());
    }

    return 0;
}


AC的C++语言程序如下:

/* UVA10935 Throwing cards away I */

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    int n;

    while(cin >> n && n) {
        queue<int> q;

        for(int i=1; i<=n; i++)
            q.push(i);

        cout << "Discarded cards:";

        bool nofirst = false;
        while(q.size() >= 2) {
            if(nofirst)
                cout << ",";
            nofirst = true;

            cout << " " << q.front();

            q.pop();
            q.push(q.front());
            q.pop();
        }
        cout << endl << "Remaining card: " << q.front() << endl;
    }

    return 0;
}





Spring AOP(面向切面编程)是Spring框架中的一个重要模块,它提供了一种在程序运行期间动态地将额外的行为织入到代码中的方式。AOP可以帮助我们将与核心业务逻辑无关的横切关注点(如日志记录、事务管理、安全性等)从业务逻辑中分离出来,使得代码更加模块化、可维护性更高。 在Spring AOP中,通过定义切面(Aspect)和连接点(Join Point),我们可以将切面逻辑应用到目标对象的特定方法上。切面是一个包含了一组通知(Advice)和切点(Pointcut)的类,通知定义了在连接点上执行的逻辑,而切点则定义了哪些连接点会被应用通知。 Spring AOP支持以下几种类型的通知: 1. 前置通知(Before Advice):在目标方法执行之前执行。 2. 后置通知(After Advice):在目标方法执行之后执行,无论是否发生异常。 3. 返回通知(After Returning Advice):在目标方法成功执行并返回结果后执行。 4. 异常通知(After Throwing Advice):在目标方法抛出异常后执行。 5. 环绕通知(Around Advice):包围目标方法的执行,在方法调用前后都可以执行自定义的逻辑。 Spring AOP的实现方式主要有两种:基于代理的方式和基于字节码增强的方式。基于代理的方式使用JDK动态代理或CGLIB来生成代理对象,而基于字节码增强的方式则通过修改字节码来实现。 使用Spring AOP,我们可以将横切关注点与核心业务逻辑解耦,提高代码的可维护性和可重用性。同时,Spring AOP还提供了灵活的配置方式,可以通过XML配置、注解或者Java配置来定义切面和通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值