咖啡


私信TA

用户名:Tianxn

访问量:128018

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 8
经  验 26039
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

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

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


 

0.0分

11 人评分

  评论区

试了一下楼主的代码,N=1000过不了,1001过得了。
2023-03-12 16:57:52
我c++写的 n=26时跑了16秒
2020-02-14 18:02:10
没有想到这个问题。楼主厉害。
2019-06-05 09:25:45
我用c语言写的,自己直接用26测得,直接爆了,还是得用c++写好点(虽然这题系统AC了,估计几个点比较小)
2019-03-18 18:58:30
  • «
  • 1
  • »