FJ的字符串

本文探讨了解决字符串问题时从递归思路转向非递归方法的过程。作者通过实例展示了如何用一个大字符数组来存储输出字符,以减少内存占用,用空间换取时间效率。同时,提供了递归和非递归两种代码实现。
摘要由CSDN通过智能技术生成
基础练习 FJ的字符串  
  
问题描述  
  FJ在沙盘上写了这样一些字符串:  
  A1 = “A”  
  A2 = “ABA”  
  A3 = “ABACABA”  
  A4 = “ABACABADABACABA”  
  … …  
  你能找出其中的规律并写所有的数列AN吗?  
输入格式  
  仅有一个数:N ≤ 26。  
输出格式  
  请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、  
  
回车符。  
样例输入  
3  
样例输出  
ABACABA  

解题思路:由题意可以很自然地想到采用递归的方式来做,但递归的方式总是让我感觉占用了太多的内存,所以转而采取开辟一个非常大的字符数组用来储存要输出的字符,利用空间来换取时间。具体的操作就是将新的字符加到数据当中,然后将之前以及存在的字符再复制一遍。

递归代码:

#include<stdio.h>


void printS(int n) {
  if (n == 0) return;
  printS(n - 1);
  printf("%c", 'A' + n - 1);
  printS(n - 1);
}

int main() {
  freopen("output.txt", "w", stdout);
  int N;
  scanf("%d", &N);
  printS(N);
  printf("\n");
  return 0;
}

非递归代码:

#include<stdio.h>

#define MAX 2<<26-1

char s[MAX] = {'0'};

int main() {
  int N, now = 1, i, j;
  scanf("%d", &N);
  freopen("out.txt", "w", stdout);
  s[0] = 'A';
  for (i = 1; i < N; i++) {
	s[now++] = 'A' + i;
	for (j = now; j < now * 2 - 1; j++)
	  s[j] = s[j - now];
	now = j;
  }
  int num = 2 << N - 1;
  for (int i = 0; i < num; i++)
	printf("%c", s[i]);
  printf("\n");
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值