1 2 3 4 5
12 23 34 45
123 234 345
1234 2345
12345
上次课老师留了一个作业:将12345按上面这种方式在屏幕上输出。
这个看似简单的内容,我这种菜鸡花了好几个小时才完成,下面是我的代码:
int fun(int i,int j)
{
int flag,fl=5;//f1控制递归时输出的段数
if(i>1)
fun(i-1,j);
while(j>0&&j<6&&fl>=i)
{
for(flag=0;flag<i;flag++)//控制每次输出的数的个数,最深层递归时,每个数段只输出一个数,依次类推
printf("%d",j++);
fl--;
for(flag=5;flag>i;flag--)//控制每个数输出之后的空格数
printf(" ");
for(flag = 1;flag<i;flag++)//该循环保证while循环正常,即每次while循环时j的值在一个循环内部多次改变
j--;//而在每个while循环间只加一
}
printf("\n");//完成一次递归进行换行
return 0;
}
int main()
{
int i = 5,j = 1;
fun(i,j);
}
我自己是用递归写出来的,很麻烦,变量比较多,而且各个变量之间并不是简单的没有联系,而是相互制约相互影响
今天老师用循环写出来,一目了然
int main()
{
int n = 5;
int s,i,j,k;
for(s = 1;s<=n;s++)
{
for(i = 1;i<=n-s+1;i++)//控制输出字符段个数
{
j = i+s-1;//字符数与段数关系
for(k = i;k<=j;k++)//控制每段字符数
{
printf("%d",k);
}
for(k = n;k>s;k--)
printf(" ");
}
printf("\n");
}
}
姜还是老的辣
把行数s表示,每行输出的数段数用i控制其循环,每个数段输出的数的个数用k来控制其循环
由于输出空格的循环和数段是并行的循环,因此也用k来控制其循环,
第一层循环时,s = 1,n - s + 1 = 5,j = i + s - 1;此时i <= n-s+1;n-s+1表示数段个数,第一层循环时为5,即第一行输出
5个数段,;j表示每个数段中数的个数,第一层为1,然后就是空格数,每行依次递减
下面是运行结果