| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1112 人关注过本帖, 1 人收藏
标题:输出二维斜矩阵,高手请围观
只看楼主 加入收藏
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:0 
从代码上看,十楼的最好了,最有效率了!!!!!!!!!!!!!!!!
2011-08-26 18:20
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
收藏
得分:0 
如果可以解释下,写代码的算法就更加好了
2011-08-26 19:45
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
收藏
得分:0 
# include <stdio.h>

int main (void)
{
    int n;
    int i,j,k;
    int m=1;
    int x,y;
    int a[100][100];
   
    printf("输入斜矩阵的阶数  ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {     x=i;
        for(j=0;j<=i;j++)
            a[j][x--]=m++;
    }
    /*
    for(i=1;i<n;i++)
    {    y=i;
        for(j=n-1;j<=i;j--)
            a[y++][j]=m++;
    }*/

        for (j=0; j<n; ++j)
        {
            for (k=0; k<n; ++k)
                printf("%-5d",a[j][k]);
            printf("\n");
        }
    }

大家帮我看看为什么我的只能输出一半,注释掉的是另一半,去掉注释后就提示应用程序错误,大家帮我看看另一半的输出有什么问题吗?多谢!
2011-08-26 22:30
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
收藏
得分:0 
# include

int main (void)
{
    int n;
    int i,j,k;
    int m=1;
    int x,y;
    int a[100][100];
   
    printf("输入斜矩阵的阶数  ");
    scanf("%d",&n);
    for(i=0;i
2011-08-26 22:34
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
回复 10楼 beyondyf
和你有一拼,顺便说一句“差点被TC玩神经了”

程序代码:
main(){
    int i,u,x=0,y=0,n,z=1,a;
    scanf("%d",&n);
    a=n;
    for(i=0;i<n;i++){
        z+=x;
        y=z;
        for(u=0;u<n;u++){
            y+=(u<a)?u+x:n-u+a-1;
            printf("%5d",y);
        }
        x++;
        a--;
        printf("\n");

    }
}


[ 本帖最后由 虾B写 于 2011-8-26 23:09 编辑 ]

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-08-26 22:50
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
收藏
得分:0 
#include <stdio.h>
int main (void)
{
    int n;
    int i,j,k;
    int m=1;
    int x,y;
    int a[100][100];
    printf("输入斜矩阵的阶数  ");
    scanf("%d",&n);   
    for(i=0;i<n;i++)
    {     x=i;
        for(j=0;j<=i;j++)
            a[j][x--]=m++;
    }   
    for(i=1;i<n;i++)
    {    y=i;
        for(j=n-1;j>=i;j--)
            a[y++][j]=m++;
    }
        for (j=0; j<n; ++j)
        {
            for (k=0; k<n; ++k)
                printf("%-5d",a[j][k]);
            printf("\n");
        }
    }
自己找到错误了,有个符号写反了
2011-08-27 08:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:4 
楼主这个方阵无论从横向、纵向,还是斜线方向上都是很有规律的,计算方法也多种多样,完全可以按自己的喜好去做。

计算这样的方阵可以用填充,至于如何填充,选什么方向,在算法复杂度上没什么差别。

15楼的做法随然没有用缓冲数组,但其实仍然是横向填充。

这里我对填充下个定义吧,就是当前元素值的计算依赖于之前元素的值。

我之前的做法不属于填充, 那其实是一个元素值相对于其位置的函数。

当然,因为算法很简单,就直接写在循环里了,它完全可以做为一个独立的函数体使用。

如下:
程序代码:
int element(int n, int row, int col)
{
    int k, s;
    k = row + col;
    s = k * (k + 1) / 2;
    if(k >= n)
    {
        k -= n - 1;
        s -= k * k;
    }
    return s + row + 1;
}
int main()
{
    int i, j, n;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            printf("%-5d", element(n, i, j));
        printf("\n");
    }
    return 0;
}

对于输出全部方阵来说,它的优势与其它方法相比并不明显。

但如果是计算大型方阵的一部分的话,它的优势将是让人欣慰的。

比如说计算一个阶数为1,000,000,000的方阵。如果打算将这个方阵完整地输出到文件,即使以二进制方式存储也需要3百多万T的空间。

使用这样的方阵也很不现实。但如果我们只是需要这个方阵的第15375行到15390行、36999998列到37000013列之间的元素。该怎么做呢?

这个问题不仅仅是个游戏,在现实中也是很有意义的。
收到的鲜花
  • 虾B写2011-08-27 11:46 送鲜花  10朵   附言:想的很透彻

重剑无锋,大巧不工
2011-08-27 10:55
快速回复:输出二维斜矩阵,高手请围观
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018929 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved