题目:
(1)把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串;
(2)删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母;(3)得到的新串再进行删除奇数位置字母的动作;
(4)如此下去,最后只剩下一个字母,请写出该字母。
#include<iostream>
#include<cstring>
#define M 19
#define N 2014
using namespace std;
char a[M];//用来存储从a开始的前 M个 字母
char b[N];//用来存储这重复 M/N次的 M个字母
char c[N / 2];//用来保存被标记后遗留下来的字母,由于第一次存储时已被抽取一次,即最大也只能为一半
int main(){
int k = 0;//记录被抽取字母后,被遗留下来的那些字母的下标
int r = N;//给 r 赋初值为N ,r主要用来保存被抽取一次后剩下字母的个数来作为循环的次数
//打印并保存那前 M个字母
for(int i = 0; i < M; i ++ ){
a[i] = 'a' + i;
cout<<a[i];
}
cout<<endl;
//打印并保存前 N个字母
for(int t = 0; t < N / M; t++){
for(int i = 0; i < M; i ++){
b[t * M + i] = a[i];
cout<<b[t * M + i];
}
}
cout<<endl;
cout<<strlen(b)<<endl; //检验被保存的数组 b的长度是否为 N
//根据判断,剔除第奇数个的字母
do{
for(int j = 0; j < r; j ++){
if(j % 2 == 0){//由于下标从零开始。故若下标为偶数 , 则被标记为零 ,剔除
b[j] = 0;
}
if(b[j]){
c[k++] = b[j]; //保存遗留下来的字母
}
}
r = k ;//将新产生的数组的长度赋值给 r 作为新的循环次数
k = 0; //重新初始化 k ,使数组c重新存储遗留的字母
memcpy(b , c ,r);//将数组c中数据全部给b 使循环成立
/*******************************************************************************************
检测每次被剔除字母后,数组b的打印情况及 do{}while循环的判断条件 r 的大小,从而确定 r的值
for(int s= 0; s < r; s++){
cout<<b[s];
cout<<"rrrr"<<r<<endl;
}
*******************************************************************************************/
}while(r > 1);
//输出最后留下的值
cout<<b[1];
return 0;
}