题目:输入一个整数N(N<10),如果N=3,则输出 1 222 33333 222 1 依次类推。
分析: 一共输出2*N-1行 设行数为m,则第m行输出m-1个空格,2*m-1个数字 当m<=N 时,该行输出的数字为m 设n=N,则当m>N 时,该行输出的数字为--n
解法一: 更基础的算法,目的是做出来就行 程序体较难看 main() { int i=1,j=0,k=0,n=0,m=0; scanf("%d",&n); while(k<2*n-1) { if(i<=n) { for(j=0;j<n-i;j++) printf(" "); for(j=0;j<2*i-1;j++) printf("%d",i); printf("\n"); i++;k++; } else { for(j=0;j<i-n;j++) printf(" "); for(j=0;j<(4*n-2*i-1);j++) printf("%d",2*n-i); printf("\n"); i++;k++; } } }
往下程序体就比较好看了 解法二: 对上一个算法求精,这样做评卷人的打分会高一些 main() { int n,i,s=1,k; scanf("%d",&n); k=2*n-1; while(k!=0) { for(i=0;i<n-1;i++) printf(" "); for(i=0;i<2*s-1;i++) printf("%d",s); printf("\n"); if(s<k){--n;++s;--k;} else {++n;--s;--k;} } }
解法三: 在将上一算法函数化,并带一点递归算法的味道,接近北大的更高要求 int abc(int n,int s,int k) { int i; if(k==0) return; for(i=0;i<n-1;i++) printf(" "); for(i=0;i<2*s-1;i++) printf("%d",s); printf("\n"); s<k?abc(--n,++s,--k):abc(++n,--s,--k); } main() { int n; scanf("%d",&n); abc(n,1,2*n-1); }
算法四: 将上一算法完全递归化,达到C语言语法和逻辑上两方面的颠峰 |