C ++, 926 ไบต์
#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;}
นี่ไม่ใช่ความสง่างาม แต่มันไม่ได้ใช้หน่วยความจำมากสำหรับ n ขนาดใหญ่ ยิ่งกว่านั้นมี (เกือบแน่นอน) ประมาณ 20 ตัวอักษรที่สามารถตีกอล์ฟต่อไปได้ แต่ฉันไม่สามารถทนดูได้อีกต่อไป
คำอธิบายสั้น ๆ :
สิ่งนี้จะแยกเส้นในเกลียวออกเป็นสองประเภท: อันที่มี ****** อยู่ตรงกลางและอีกอันที่มี \ s \ s \ s \ s \ s อยู่ตรงกลาง จากนั้นเป็นที่ชัดเจนว่าแต่ละบรรทัดประกอบด้วย "*" s หลายอันตรงกลางและบางส่วน "*" การพิจารณาว่าแต่ละสิ่งมีความเรียบง่ายเพียงใดหากคุณดูลวดลายเป็นเวลานานพอ สิ่งที่ยุ่งยากคือการพิมพ์จุดศูนย์กลางของเกลียวซึ่งโดยทั่วไปฉันเขียนโค้ดยากโดยใช้เงื่อนไข สิ่งนี้กลายเป็นประโยชน์เพราะ *** และ \ s \ s \ s สลับบรรทัดเป็นเลขคี่ / คู่
แบบทดสอบ:
อินพุต: 55
(ฉันคิดว่าสิ่งที่ยิ่งใหญ่ดูดีที่สุด)
เอาท์พุท:
************************************************** *****
* * * *
************************************************** *** *
* * *
* *************************************************** * *
* * * * *
* * *********************************************** * * *
* * * * * * *
* * * ******************************************** * * * *
* * * * * * * *
* * * * ************************************** * * * * *
* * * * * * * * * * *
* * * * * ********************************* * * * * * *
* * * * * * * * * * * * *
* * * * * * ***************************** * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * ************************* * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * ********************* * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * ***** ***************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ********* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ***** * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - {- โปรแกรมของฉันเพิ่มพื้นที่ที่นี่ btw
* * * * * * * * * * * * * * *** * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *********** * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * *************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * ********************* * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * *********************** * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *************************** * * * * * * *
* * * * * * * * * * * * * *
* * * * * * ******************************* * * * * * *
* * * * * * * * * * * *
* * * * * ************************************ * * * * *
* * * * * * * * *
* * * * **************************************** * * * *
* * * * * * * *
* * * ********************************************* * * *
* * * * * *
* * ************************************************** * * * *
* * * *
* *************************************************** ** *
* *
************************************************** *****
การป้อนข้อมูล: 3
เอาท์พุท:
***
* * * *
* *
***
หมายเหตุ: ฉันไม่ใช่นักวิทยาศาสตร์คอมพิวเตอร์ / นักเรียน CS และฉันไม่รู้วิธีพิสูจน์ว่าใช้หน่วยความจำ O (log n) ฉันทำได้เฉพาะสิ่งที่ต้องทำตามลิงก์ในคำถาม ฉันจะขอบคุณถ้ามีใครสามารถยืนยัน / ปฏิเสธถ้าคำตอบนี้ถูกต้อง ตรรกะของฉันสำหรับความถูกต้องของคำตอบนี้คือมันไม่เคยเก็บตัวแปรขนาดใด ๆ ตาม n ยกเว้นอินพุตเอง แทนการวนซ้ำที่รัน n คูณคำนวณค่าจำนวนเต็มแทน n มีค่าจำนวนเดียวกันโดยไม่คำนึงถึงอินพุต
Note2: วิธีนี้ใช้ไม่ได้กับ n = 1 เนื่องจากวิธีการจัดการกับส่วนกลางของฉัน สิ่งนี้จะแก้ไขได้ง่ายด้วยเงื่อนไขดังนั้นหากใครก็ตามที่มีคำตอบของฉันไม่กี่ตัวละครฉันจะแก้ไข;)
เล่นกับมันใน ideone
n
ในหน่วยความจำ O (1)