如何输出方阵用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个值逐个放入对角线,代码如下:
代码:
#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],以此类推,代码如下:
代码:
#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;
}