@Metralix
2016-10-17T16:01:22.000000Z
字数 572
阅读 873
这题探究将一个数组中的数置换多少次,可以成一个1~n的全排列。首先数组中超过n的数肯定要被置换,我将其记录为t个。然后将这个数组由小到大排列,那么前n-t个项都是合法的数字,将这些数字遍历一遍,记录其中不同的数为cou,这些数不用置换,后t个数全部置换
那么最终需要置换的数为n-cou。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,cou=0,d=0,j,t=0;
int a[5000];
scanf("%d",&n);
//if(n=1)
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(a[i]>n)
{
a[i]=0;
t++;
}
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n-1-t;i++)
{
if(a[i+1]!=a[i])
{
cou++;
}
}
if(t==n)
printf("%d",n-cou);
else printf("%d",n-cou-1);
return 0;
}