問題描述
FJ在沙盤上寫了這樣一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的規律並寫所有的數列AN嗎?
輸入格式
僅有一個數:N ≤ 26。
輸出格式
請輸出相應的字符串AN,以一個換行符結束。輸出中不得含有多余的空格或換行、回車符。
樣例輸入
3
樣例輸出
ABACABA
#include"iostream"
using namespace std;
long N=1500000;
long n; //字符串長度
int k,record; //k為題目第N行,rerocd記錄
void recursion(char ch[],int i) //遞歸
{
if(k==record)
return;
record++;
long j,m=n;
ch[n++]=65+i; //將下一個字母存進來
ch[n]='\n';
for(j=0;j
ch[n++]=ch[j];
ch[n]='\n';
recursion(ch,i+1);
}
int main()
{
char ch[N];
long i=0;
cin>>k;
recursion(ch,0);
while(ch[i]!='\n')
cout<<ch[i++];
cout<<endl;
cout<<n<<endl;
return 0;
}
這張圖片是我輸入k=20情況,這時候字符串長度n已經100萬多長了。。然而我想增加宏定義N 長度 。。增加到200萬的時候,程序就奔潰了。。但是題目要求k<=26.
請問有什麼辦法改進。
如樓上用遞歸是可以的 不過使用遞歸的話會調用很多次遞歸函數 可以使用循環,這可能會需要很大的空間,從1開始計算要輸出的字符串,並依次推出下個數字要輸出的字符串直到到達n. 如圖給出了兩種方法的代碼 注釋掉了遞歸函數的調用,兩種方法時效性差不多,親測n為20都需要55秒左右,至於空間消耗 遞歸每次調用都會產生額外的消耗 至於哪個消耗更大 樓主自己查算一下看 不是特別清楚