设计一个函数nosame:int nosame(int *a, int m, int n)
a是一个指向二维数组首元素的指针,所指向的数组m+1行,n+1列,其中第0行和第0列的数据无效,也就是只需要判断1-m行和1-n列的数据就可以,如果这个数组的所有整数各不相同,则返回0,否则返回-1
main函数
int main()
{
int a[5][6]={
{0},
{0,1,2,3,4,5},
{0,11,12,13,14,15},
{0,21,22,23,24,25},
{0,31,32,33,34,35}
};
printf("%d\n", nosame((int *)a, 4,5));
return 0;
}
nosame函数:
int nosame(int *a, int m, int n)
{
int i,j;
int head=n+1+1; /*第一个有效元素的位置*/
int tail=m*(n+1)+n; /*最后一个有效元素的位置*/
for(i=head;i<tail;i++) /*遍历数组,依次寻找*/
{ /*最后一个元素不用比较,到最后一个时,后面无元素重复*/
if(i%(n+1)==0)
continue;
for(j=i+1;j<=tail;j++)
{
if(j%(n+1)==0)
continue;
if(*(a+i)==*(a+j))
return -1;
}
}
return 0;
}
整体代码如下:
#include<stdio.h>
#include<stdlib.h>
int nosame(int *a, int m, int n)
{
int i,j;
int head=n+1+1;
int tail=m*(n+1)+n;
for(i=head;i<tail;i++)
{
if(i%(n+1)==0)
continue;
for(j=i+1;j<=tail;j++)
{
if(j%(n+1)==0)
continue;
if(*(a+i)==*(a+j))
return -1;
}
}
return 0;
}
int main()
{
int a[5][6]={
{0},
{0,1,2,3,4,5},
{0,11,12,13,14,15},
{0,21,22,23,24,25},
{0,31,32,33,34,35}
};
printf("%d\n", nosame((int *)a, 4,5));
return 0;
}
运行结果:
小结:
这道题主要考察的是,关于数组中各元素位置的问题。不同维度的数组有不同的计算公式,这里应用的是二维数组的公式:Loc(A[i][j])=Loc(A[1][1])+n*(i-1)+(j-1) 。