对数组A中的N(0<N<100)个整型元素进行从小到大连续编号,要求不能改变数组A中的元素顺序,且相同元素有相同编号。例如A=(5,3,4,7,3,5,6)则输出:(3,1,2,5,1,3,4)
该怎么实现啊?一点头绪都没有。
请大家支支招啊。
----------------解决方案--------------------------------------------------------
表排序.
----------------解决方案--------------------------------------------------------
可以用一个临时数组中,把A的7个数按升序放入B中,去掉重复的。
然后遍历A的每个数,然后输出该数在B中的下标+1(下标从0开始);
参考程序:
main()
{
int a[7]={5,3,4,7,3,5,6},b[7]={0};
int i,j,n;
/*把A中的数去掉重复的放入B中*/
b[n++]=a[0];
for(i=1;i<7;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
break;
}
if(j==n)
{
b[n++]=a[i];
}
}
/*把B中的排序*/
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(b[i]<b[j])
{
int t; t=b[i];b[i]=b[j];b[j]=t;
}
}
/*在B中找A中每个数对应的下标*/
for(i=0;i<7;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
printf("%d,",j+1);
}
}
}
以上只是我个人的理解,还请大家指正……
----------------解决方案--------------------------------------------------------
用指针
----------------解决方案--------------------------------------------------------
#include <conio.h> /*已在Turboc2 环境下测试通过*/
#define N 7
int A[N]={5,3,4,7,3,5,6},B[N],C[N];
void px()
{int t,i,j,temp;
for(i=0;i<N;i++)
B[i]=A[i]; /*用数组B暂存数组A*/
for(i=0;i<N-1;i++) /*把数组B中的数按照从小到大的顺序排序*/
{ t=i;
for(j=i+1;j<N;j++)
if(B[t]>B[j]) t=j;
if(t!=i)
{temp=B[i];B[i]=B[t];B[t]=temp;}
}
}
void bh()
{int i,j,k;
for(i=0;i<N;i++)
C[i]=1; /*C数组用来存序号,初始数值全为1*/
for(i=0;i<N;i++)
for(j=0;j<N;j++) /*把A数组和B数组遍历比较,在B[j]中找到一个比A[i]大的数,则序号C[i]加1
注意:若B[j]数组中存在相等数值,则用最后一个和数组A[i]比较,避免重复计数*/
{if((B[j]<A[i])&&B[j]!=B[j+1])
C[i]=C[i]+1;
}
}
main()
{int i;
px();
bh();
clrscr();
for(i=0;i<N;i++)
printf("A[%d]=%d,C[%d]=%d\n",i,A[i],i,C[i]);
getch();
}
[此贴子已经被作者于2007-11-8 12:22:36编辑过]
----------------解决方案--------------------------------------------------------
随便写了一个,将就看看吧,思想就是比较所有两个数之间的大小,大于的化,编号就加一。
还有就是如果大于同一个数的时候,编号只加一次....
[CODE]
#include<stdio.h>
#include<stdlib.h>
#define N 7
int main()
{
int a[N]={5,3,4,7,3,5,6};
int b[N];
int i,j,k;
for (i=0; i<N; i++)
b[i]=1; /* 因为编号从一开始,所以全部初始化为一 */
for (i=0; i<N; i++)
for (j=i; j<N; j++)
{
k=0;
if (a[i]-a[j]>0) /* a[i]大于一个数,b[i]就加一 */
{
while (a[j] != a[k] && k<j)
k++;
if (k == j) /* 保证大于的这个数是以前没有比较过的 */
b[i]++;
}
else if (a[i]-a[j]<0) /* 如果是小于,则对方加一 */
{
while (a[i] != a[k] && k<i)
k++;
if (k == i) /* 和上面一样,保证这个比它小的数前面没有出现过 */
b[j]++;
}
}
for (i=0; i<N; i++)
printf("%3d",b[i]);
system("pause");
return 0;
}
[/CODE]
----------------解决方案--------------------------------------------------------
用二叉树。输出该数据的路径数即可
----------------解决方案--------------------------------------------------------
6 楼的程序不错
[此贴子已经被作者于2007-11-8 13:37:13编辑过]
----------------解决方案--------------------------------------------------------
3最小```所以编号是1````7是第5个最大的数``所以编号是5````明白?
我也没想出什么好办法来``
----------------解决方案--------------------------------------------------------
谢谢8楼的夸奖
----------------解决方案--------------------------------------------------------