#include <stdio.h>
#include<math.h>
int main() {
int i=1,j=0,k=1,m,p;
char n;
scanf("%c",&n);
if(48<n&&n<58){
m=n;
m-=48;//m为输入的数字的本身 i行数 k类似于1234321的行标记 j每行的每个元素 p输出的数字
while(i<=2*m-1){
p=i;
for(j=1;j<=2*m-k;j++){
if(j==2*m-k){
printf("%d\n",p);
p++;
}
else if(j==k){
if(p>9)p-=9;
printf("%d",p);
}
else printf(" ");
}
i<m?(k++):(k--);
i++;
}
}
else printf("input error\n");
return 0;
}
这道题也出现了bug,需要注意几点:
1 n是char型,不能直接参与运算,先转换类型。
2 明确每个量的含义,一开始就写出注释,不要混淆。
3 隐蔽的漏洞:如果两个if语句
if(j==2*m-k){
printf("%d\n",p);
p++;
}
else if(j==k){
if(p>9)p-=9;
printf("%d",p);
交换位置,最中间的数字两个if条件重合,只执行不带换行符的,错误了。
if(p>9)p-=9;这句话的位置也很关键。