问题描述】
某人有一个保险箱,内存贵重物品。他特别害怕忘记了保险箱密码,就将密码记在纸条上,又担心保险箱密码失窃。为此,他设计一个给保险箱密码加密的方法。保险箱密码为一串数字,加密后还是一串数字,根据下面规则可以得到明码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾;再将新数字串的第一个数删除,并将第二个数放到这串数字的末尾;如此循环,直到剩下最后一个数;将最后这个数也删除;按照刚才删除的顺序,将这些数字连在一起就是明码。
【输入格式】
输入保险箱密码的密码,即一串十进制数字,长度在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;
}