c语言:删去一维数组中所有相同的数, 使之只剩一个.求一完整正确程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言:删去一维数组中所有相同的数, 使之只剩一个.求一完整正确程序相关的知识,希望对你有一定的参考价值。
请编写函数fun, 函数的功能是: 删去一维数组中所有相同的数, 使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。在主函数中调用这个函数。例如, 一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 删除后, 数组中的内容应该是: 2 3 4 5 6 7 8 9 10。
参考技术A #include<stdio.h>int fun(int a[],int n)
int i,j=0;
for(i=1;i<n;i++)
if(a[j]!=a[i])
a[++j]=a[i];
return j;
void main()
int a[]=2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10;
int len,i;
len=fun(a,sizeof(a)/sizeof(int));
for(i=0;i<=len;i++)
printf("%d ",a[i]);
printf("\\n");
追问
可以来一个不是只有固定答案的不?我需要一个可以对许多不同数组进行处理的程序,谢谢
追答这个。。。你要用字符串的形式输入
再转化成整数。。。这部分自己实现
C语言。删去一维数组中所有相同的数,使之只剩一个。程序如下求改错。
/* 请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大
的顺序排列,函数返回删除后数组中数据的个数。
例如,一维数组中的数据是:
2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。删除后数组中的内容应该是:2 3 4 5 6 7 8 9 10。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
*/
#include <stdio.h>
#define N 80
int fun(int a[], int n)
int i,k,s;
s=n;
for(i=0;i<n;i++)
if(a[i]==a[i+1])
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
return s;
void main()
int a[N]=2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10,i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n\n");
if(a[i]==a[i+1]) /*错误:c从0~n-1取值,此处i+1已越界了*/
for(k=i;k<n;k++) /*修改:此处改成k<n-1*/
a[k]=a[k+1]; /*错误:c从0~n-1取值,此处k+1已越界了*/
由于a[k]=a[k+1]; 保证了最后一位已经移到前面,因此修改的地方,不会发生漏选错误。 参考技术A 他这个是有错误的,222最后会变成22,只有再把他那个fun里的实现方法在复制一遍才可以消除。因为你看a[]=2,2,2,3;的话,a[0]==a[1]判断,成立,a[0]=a[1]依次赋值过去。可是再往后i已经变成2,再往后是a[2]==a[3]的判断,也就是2==3,显然不成立,所以保留了两个相邻的2。即结果等于a[]=2,2,3.
解决方法是再次的复制这个for语句下,就OK了。
#include <stdio.h>
#define N 80
int fun(int a[], int n)
int i,k,s;
s=n;
for(i=0;i<n;i++)
if(a[i]==a[i+1])
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
for(i=0;i<n;i++)
if(a[i]==a[i+1])
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
return s;
void main()
int a[N]=2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10,i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)
printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<20;i++)
printf("%3d",a[i]);
printf("\n%d\n",n);
参考技术B 你的算法错误,我帮你修改如下!
我的算法比较简单,你仔细跟踪下便知。
int fun(int a[], int n)
int i, k, s;
s = n;
for(i = 0, k = 0; i < n - 1; i++)
for(NULL; k++, k < n; NULL) //把k++放在条件处,因为if 和else共用
if(a[i] == a[k])
s--;
else
a[i + 1] = a[k];
break;
//else
//for
//for
return s;
参考技术C int fun(int a[], int n)
int i,k=0;
int b[N];
b[0]=a[0];
for(i=1;i<n;i++)
if(b[k]==a[i])
continue;
else
b[k++]=a[i];
for(i=0;i<=k;i++)
a[i]=b[i];
return k+1;
以上是关于c语言:删去一维数组中所有相同的数, 使之只剩一个.求一完整正确程序的主要内容,如果未能解决你的问题,请参考以下文章