如:输入【1,1,1,2,2,2,0,,5,1,3】和【0,1,1,0,4,4,3,2】
输入【5】和【4,4】
#include <iostream>
using namespace std;
bool Removeduplicate(int data[],int &lon,int a);//去掉数组中为a的数据
int main()
{
int l1=10;
int l2=10;
int a1[10]={10,10,12,26,56,26,30,30,20,10};
int a2[10]={10,12,56,10,20,22,22,33,33,30};
int j=0,i;
while(j<=l1)
{
if(Removeduplicate(a1,l1,a2[j])) //如果有删除就说明两数组中有有相同数据a2[j]
{
Removeduplicate(a2,l2,a2[j]); //如果a2[j]数据是重复数据就删除
}
else
{
j++; //如果没有重复数据就判断下一个数据
}
}
cout<<"l1="<<l1<<endl;
for(i=0;i<l1;i++)
cout<<a1[i]<<" ";
cout<<endl;
cout<<"l2="<<l2<<endl;
for(i=0;i<l2;i++)
cout<<a2[i]<<" ";
cout<<endl;
return 0;
}
bool Removeduplicate(int data[],int &lon,int a) //去掉数组中为a的数据
{
int mak=0; //标志位
for(int i=0;i<lon;i++)
{
if(data[i]==a)//找到相同数据就删除
{
for(int j=i;j<lon-1;j++)
{
data[j]=data[j+1]; //删除相同数据
}
i--;
lon--;
mak++; //标志有进位就说明有删除
}
}
if(mak>0) //有删除就返回真
return true;
else
return false;
}
这个程序本身是正确的,但是因为开了两个标记数组,如果输入的数组大的话,多开两个素组就多耗费一倍内存了。不过还是谢谢你认真回答了。
追答好吧,其实我有考虑过,要实现楼主所采纳的答案也不难,只不过因为每次删一个数对于数组来说很浪费时间,需要移动很多数,所以我就用空间换取时间吧,因为一般内存那么多,不用白不用。我的方法使用标志位,只需要双层循环一次就可以了。最好,节约时间和节约空间,各有所好吧。
如果数组中本来就有32769这个数呢?声明的数组是长整型,所以,输入的数就可以是长整型数,这样就会出现错误,是不是?
追答如果是长整型,那就把作为标志的32769改为'\0' //即空,就可以了啊
本回答被网友采纳