yoj获取密码 队列 解密 C语言

问题描述】
某人有一个保险箱,内存贵重物品。他特别害怕忘记了保险箱密码,就将密码记在纸条上,又担心保险箱密码失窃。为此,他设计一个给保险箱密码加密的方法。保险箱密码为一串数字,加密后还是一串数字,根据下面规则可以得到明码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾;再将新数字串的第一个数删除,并将第二个数放到这串数字的末尾;如此循环,直到剩下最后一个数;将最后这个数也删除;按照刚才删除的顺序,将这些数字连在一起就是明码。
【输入格式】
输入保险箱密码的密码,即一串十进制数字,长度在6位至9位之间,包括6位和9位。
【输出格式】
保险箱密码的明码,即长度在6位至9位之间的一串十进制数字,包括6位和9位。
【输入样例】
631758924
【输出样例】
615947283
【数据说明】
不含数字0的输入数据占50%。

使用递归就行了

#include <stdio.h>

void func(char *p, int n)
{
    if(n <= 1) {
        printf("%c", p[0]);
    }
    else {
        char first, second;
        first = p[0]; //取出第一个
        second = p[1]; //取出第二个
        for(int i=0; i<n-2; i++) { //从第三个开始依次从第一个位置开始放
            p[i] = p[i+2];
        }
        p[n-2] = second; //第二个放到最后
        p[n-1] = '\0'; //字符串结束符
        printf("%c", first); //输出删除的数字
        func(p, n-1); //递归调用
    }
}

int main()
{
    char str[10] = {0};
    scanf("%s", str);
    func(str, strlen(str));

    return 0;
}

这思路很清晰了,可以直接对着写代码。

如果有遇到问题,我们可以聊聊。

这不就是一直得到奇数位么,首尾循环

#include <stdio.h>
#include <math.h>
int main()
{
    int n,m,b=0;
    scanf("%d",&n);
    m=n;
    while(m>0)
    {
        b++;
        m/=10;
    }
    while(n>0 || b>0)
    {
        printf("%d",(int)(n/pow(10.0,b-1)));
        n = n%(int)pow(10.0,b-1);
        b--;
        if(n!=0)
            n = n/(int)(pow(10.0,b-1)) + n%(int)(pow(10.0,b-1))*10;
    }
    return 0;
}