猜字母

题目:

        (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;
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值