当前位置: 代码迷 >> C语言 >> 两个小时写的两行代码(打印菱形问题)
  详细解决方案

两个小时写的两行代码(打印菱形问题)

热度:165   发布时间:2008-04-20 00:04:36.0
两个小时写的两行代码(打印菱形问题)
看有人问输出菱形块的问题,用格式字符串写了
这两行花了整整两个多小时,看来还是不够熟练
辛苦成果忍不住拿来秀一下,明天来把注释加上

/************************************************
今天加上注释(printf函数*的使用)
算法说明:
把printf函数作为一个m的函数f(m),用两个字符串拼成
每行要输出的格式,一个字符串是空格字符组成,另一个
存放*号,因为字符无法重用,所以每个字段都加上了
字符串结束符。
为了方便思考,所有的位置控制都用m控制。
而m是循环变量i的一个映射。这个映射就想了有一个小时。
对于i从1到7,m分别是1,2,3,4,3,2,1
借助整数除法不进行四舍五入的特性,终于找到下面
一个式子表示这个折线:
m=i-(i/4)×(i mod 4)×2
************************************************/
#include<stdio.h>

int main()
{
    int i,m;
    for(i=1,m=1;i<8;i++,m=i-(i/4)*(i%4)*2)
        printf("%*s%*s\n",4-m,"    "+m-1,2*m-1,"*\0* *\0*   *\0*     *"+m*(m-1));
    return 0;
}

[[it] 本帖最后由 moonwalker 于 2008-4-20 10:05 编辑 [/it]]
搜索更多相关的解决方案: 菱形  打印  代码  

----------------解决方案--------------------------------------------------------
汉...........
----------------解决方案--------------------------------------------------------
看起来感觉不是很好。。。


----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]雨中秣燕[/un] 在 2008-4-20 00:26 的发言:[/bo]

看起来感觉不是很好。。。

http://blog.programfan.com/upfile/200804/2008040611237.gif

嗯,我也觉得,主要是因为这个字符串不能重用,/0实在是太丑了,呵呵
如果重用的情况可以整齐一点点
#include<stdio.h>

int main()
{
    int i,j;
    for(i=1,j=13;i<7;i++,j--,j--)
    printf("%*s\n",11+i,"* * * * * * * *"+j);
    return 0;
}
----------------解决方案--------------------------------------------------------
那我也写点东西吧


----------------解决方案--------------------------------------------------------
#include <stdio.h>
#define ABS(a)  (a<0?-a:a)
#define J       ABS(i)
#define N       3
int main()
{
    int i;char*p="*";
    for(i=-N;i<=N;++i)
    printf("%*s%*s\n",J+1,p,(N-J)*2,&p[J==N]);
    return 0;
}

[color=white]

[[it] 本帖最后由 雨中秣燕 于 2008-4-20 00:57 编辑 [/it]]
----------------解决方案--------------------------------------------------------
很感谢,从你这个代码有了不少启发
发现我的思路有时候比较僵化。
为了用一个循环搞定,花了很大功夫想怎么映射
却没有想到用负数
----------------解决方案--------------------------------------------------------
这规律找的。。。
----------------解决方案--------------------------------------------------------
终于找到用一个字符串的办法了,一会整理一下
希望能抛砖引玉,打开大家的思路
----------------解决方案--------------------------------------------------------
看不很懂  LZ 能详细解释一下
for(i=1,m=1;i<8;i++,m=i-(i/4)*(i%4)*2)
printf("%*s%*s\n",4-m,"   "+m-1,2*m-1,"*\0* *\0*   *\0*     *"+m*(m-1));
吗?还有飞燕的,好简单,更是看不懂了!论坛里面其他的关于菱形问题的帖子我也看了,显得复杂多了,不过对于新手的我来说还是容易懂点
算法m=i-(i/4)×(i mod 4)×2
里面的(i/4)可以不要吗?

[[it] 本帖最后由 yaozidm124 于 2008-4-20 16:36 编辑 [/it]]
----------------解决方案--------------------------------------------------------
  相关解决方案