解题思路:自己看看,题很好理解

A1  =  “A”                                串长:2^1-1=1

A2 = A1+"B"+A1                         串长:2^2-1=3

A3 = A2+"C"+A2                         串长:2^3-1=7

A4 = A3+"D"+A3                         串长:2^4-1=15

A5 = A4+"E"+A4                          ……

An = A(n-1)+('A'+n)+A(n-1)         串长:2^n-1                                                 

注意事项:

如果用数组写的话,题目中说 n<=26,那么数组大小就要至少设置为2^26-1=67108863这样的大小。数组放在mian()里面,会栈溢出的;在系统提交直接错误。但是如果把数组设置小一点就可以了。这样在编译器26就不能通过运行,因为输入26来说数组太小了。但是你提交给系统却是对的(数组较小的)。


各位可以试试 n=26的时候的结果。


参考代码:


用数组做的: 这里数组大小远远装不下n=26的时候的串;但是系统反馈却正确。 N的值不能太大!

#include <stdio.h>
#include <string.h>
#define N 1000000
char s[N]="A";
char t[N/2];
int main(void)
{
	int n, len;
	char ch = 'A';
	scanf("%d", &n);
	for(int i = 1; i < n; ++i)
	{
		strcpy(t,s);
		len = strlen(s);                //得到串得末尾位置
		s[len] = ++ch;                  //添加中间字符
		s[len+1] = '\0';                //加字符串结尾符,以便于使用strcpy函数
		strcat(s,t);
	}
	printf("%s\n", s);
	return 0;
}


用C++的string类的特性来做:这样就存在26是否由多长了,string是自己变化的来满足要求的空间的。

#include <iostream>
using namespace std;

int main(void)
{
	int n; 
	cin >> n;
  	string s = "";            //先赋值一个为空串,以免造成内存访问冲突
  	for (int i = 0; i < n; i++)
	{
  		string a = s;
  		s += i + 'A';     //string字符串+字符之后还是字符串,先把字符转换成字符串然后相加 
  		s += a;
   	}
  	cout << s;
	return 0;
}


点赞(7)
 

0.0分

10 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

风的行踪 2年前 回复TA
试了一下楼主的代码,N=1000过不了,1001过得了。
1421 5年前 回复TA
我c++写的 n=26时跑了16秒
一叶知秋 5年前 回复TA
没有想到这个问题。楼主厉害。
踏乡墨客 6年前 回复TA
我用c语言写的,自己直接用26测得,直接爆了,还是得用c++写好点(虽然这题系统AC了,估计几个点比较小)