C ++, 926 bytes
#include<iostream>
#include<string>
#include<math.h>
#define S string
using namespace std;S N(S x,int y){S z="";for(int q=0;q<y;q++){z+=x;}return z;}int main(){int n=0,t=0,g=0,fi=1;cin>>n;int t1[]={0,0,n,0};int t2[]={0,n-2,n-2,1};for(int k=0;k<n+1;k++){if((k>(n-2)/2)&&(k<(n+5)/2)){if(g==0){S d,e;if(!((n+1)%4)){cout<<N("* ",t2[0])<<" *"<<N(" *",t2[0])<<endl<<N("* ",(n+1)/2)<<endl<<N("* ",t2[0])<<"***"<<N(" *",t2[0])<<endl;t2[2]=n-8-(n-11);t1[2]=n-4-(n-11);t1[0]--;t2[3]--;t1[3]-=2;}else{cout<<N("* ",t1[0])<<"***"<<N(" *",t2[0])<<endl<<N("* ",(n+1)/2)<<endl<<N("* ",t1[0])<<"* "<<N(" *",t2[0])<<endl;t2[0]--;t1[2]+=2;t2[2]+=6;t1[3]--;t2[1]-=2;t2[3]-=2;}fi=0;}g=5;}else{t=1-t;int*tR;tR=t?t1:t2;cout<<N("* ",tR[0])<<N(t?"*":" ",tR[2])<<N(" *",tR[3])<<endl;if(fi){if(t){t1[0]+=k==0?0:1;t1[2]-=k==0?2:4;t1[3]++;}else{t2[0]++;t2[2]-=4;t2[3]++;}}else{if(t){t1[0]--;t1[2]+=4;t1[3]--;}else{t2[0]--;t2[2]+=4;t2[3]--;}}}}return 0;}
Ini tidak elegan, tetapi tidak memakan banyak memori untuk n besar. Lebih jauh lagi, ada (hampir pasti) sekitar 20 karakter yang dapat di-pegolf lebih jauh, tetapi saya tidak tahan melihatnya lagi.
Penjelasan Singkat:
Ini membagi garis dalam spiral menjadi dua jenis: yang dengan ****** di tengah, dan yang dengan \ s \ s \ s \ s \ s \ s di tengah. Maka jelas bahwa setiap baris terdiri dari beberapa "*" s, tengah, dan beberapa "*". Mencari tahu persis berapa banyak dari setiap hal itu sederhana jika Anda melihat polanya cukup lama. Yang sulit adalah mencetak pusat spiral yang saya kode pada dasarnya menggunakan kondisional. Ini akhirnya menjadi berguna karena saluran *** dan switch berubah menjadi ganjil / bahkan di sana.
Tes:
Input: 55 (Saya pikir yang besar terlihat paling keren)
Keluaran:
************************************************ *****
*
************************************************ *** *
* * *
* ************************************************* * *
* * * * *
* * ******************************************* * * *
* * * * * * *
* * * *************************************** * * * *
* * * * * * * * *
* * * * ************************************ * * * * *
* * * * * * * * * * *
* * * * * ******************************* * * * * * *
* * * * * * * * * * * * *
* * * * * * **************************** * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * ************************* * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * * ********************* * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * ***************** * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ********* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ***** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * {- program saya menambahkan spasi di sini btw
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *********** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * *************** * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * ******************* * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * *********************** * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *************************** * * * * * * *
* * * * * * * * * * * * * *
* * * * * * ***************************** * * * * * *
* * * * * * * * * * * *
* * * * * ********************************* * * * * *
* * * * * * * * * *
* * * * ************************************** * * * *
* * * * * * * *
* * * ***************************************** * * *
* * * * * *
* * ********************************************* * *
* * * *
* ************************************************* ** *
* *
************************************************ *****
Memasukkan: 3
Keluaran:
***
*
* *
***
Catatan: Saya bukan seorang ilmuwan komputer / mahasiswa CS, dan saya tidak tahu bagaimana membuktikan bahwa ini menggunakan memori O (log n). Saya hanya bisa menentukan apa yang harus dilakukan berdasarkan tautan dalam pertanyaan. Saya akan berterima kasih jika seseorang dapat mengkonfirmasi / menolak jika jawaban ini valid. Logika saya untuk validitas jawaban ini adalah bahwa ia tidak pernah menyimpan variabel ukuran berdasarkan n kecuali input itu sendiri. Sebagai gantinya, untuk loop yang berjalan n kali menghitung nilai integer berdasarkan pada n. Ada jumlah yang sama dari nilai-nilai itu terlepas dari input.
Note2: Ini tidak berfungsi untuk n = 1 karena metode saya berurusan dengan tengah. Ini akan mudah untuk diperbaiki dengan persyaratan, jadi jika ada yang berada dalam beberapa karakter jawaban saya, saya akan memperbaikinya;)
Bermain dengannya di ideone.
ndalam memori O (1).