如何输出方阵用C语言编译

如何输出方阵用C语言编译

问题描述:

从键盘输入一个n*n的方阵,将其中的n个最小值按升序存放在主对角线上并输出方阵
#include<stdio.h>

int main()
{
int i=0;
int j=0;
int tmp,n;
int arr[20];
printf("请输入您要排序的整数个数n(n<20): \n");
scanf("%d",&n);
printf("arr[%d]: ",n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(arr[j]<arr[i])
{
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
printf("排序后的%d个整数:\narr[%d]: ",n,n);
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
我不知道该怎么写了

刚才写了代码被删掉了。。。
有两种方法实现:
方法一:先排序,然后将最小的n个值逐个放入对角线,代码如下:

img

代码:

#include <stdio.h>
#include <stdlib.h>
//冒泡排序
void bubble_sort(int a[],int n)
{
    int i,j,t;
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(a[j] > a[j+1])  //从小到大,升序
            {
                t = a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}
int main()
{
    int *p;
    int i,j,n,k=1,t;
    scanf("%d",&n);
    p = (int*)malloc(sizeof(int)*n*n);
    for(i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            scanf("%d",&p[i*n+j]);
        }
    }
    //排序
    bubble_sort(p,n*n);
    //设置对角线
    for (i=1;i<n;i++)
    {
        for (j=1;j<n;j++)
        {
            if(i==j)
            {
                t = p[i*n+j];
                p[i*n+j] = p[k];
                p[k] = t;
                k++;
            }
        }
    }
    //输出
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            printf("%4d",p[i*n+j]);
        }
        printf("\n");
    }
    //释放空间
    free(p);
    p=0;
    return 0;
}

方法二:输入后,找到最小值放入a[0][0],然后找次小值放入a[1][1],以此类推,代码如下:

img

代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int **a;
    int i,j,n,k,t,min;
    int indexi,indexj;
    scanf("%d",&n);
    a = (int**)malloc(sizeof(int*)*n);
    for(i=0;i<n;i++)
    {
        a[i]=(int*)malloc(sizeof(int)*n);
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    }
    for (k=0;k<n;k++)
    {
        min = a[k][k];
        indexi = indexj = k;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(k==0)
                {
                    if(a[i][j]<min)
                    {
                        min = a[i][j];
                        indexi = i;
                        indexj = j;
                    }
                }else
                {
                    if(a[i][j]<min && a[i][j]>a[k-1][k-1])
                    {
                        min = a[i][j];
                        indexi = i;
                        indexj = j;
                    }
                }
            }
        }
        //
        t = a[k][k];
        a[k][k] = a[indexi][indexj];
        a[indexi][indexj] = t;
    }

    //输出
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            if(j<n-1)
                printf("%d ",a[i][j]);
            else
                printf("%d\n",a[i][j]);
        }
    }
    //释放空间
    for (i=0;i<n;i++)
    {
        free(a[i]);
        a[i]=0;
    }
    free(a);
    a=0;
    return 0;

}