简单问题,高分奉送.

ratrat 2001-11-29 03:51:55
一个莱鸟级数组问题:
一数组arrayA[]={23,13,42,98,23,13,13,56,42,87,42,56,42}通过编程将数组中的相同元素去掉,只保留一个,形成另一个数组arrayB[]={23,13,42,98,23,56,87,56},计算数组B的元素个数。
...全文
89 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ratrat 2001-12-01
  • 打赏
  • 举报
回复
烦请你帮我改一下,谢谢!
#include<fstream.h>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
typedef vector<int> IntArray;
// 回溯搜索生成组合
void Search(int m, int n, int depth, IntArray& mark, IntArray& L, list<IntArray>& result)
{
if( depth == n ) {
result.push_back(L);
} else {
int begin;
if( depth == 0 ) {
begin = 0;
} else {
begin = L[depth-1];
}
for( int i = begin; i < m; i++ )
if( mark[i] == 0 ) {
mark[i] = 1;
L[depth] = i + 1;
Search( m, n, depth+1, mark, L, result );
mark[i] = 0;
}
}
}
// 生成从m个数中取出n个数的组合数C(m,n)
// 结果在result中返回
void Combination(int m, int n, list<IntArray>& result)
{
if( m < n ) return;
IntArray mark(m); // 用来标记某个数字是否用过了

for( int i=0; i < m; i++ ) { // 初始化mark
mark.push_back(0);
}

IntArray comb(n); // 存储一组组合数
comb.clear();
comb.resize(n);

Search(m, n, 0, mark, comb, result);
}
// 打印组合数
void Print (list<IntArray>& combs)
{


::ofstream out("array.txt");
cout << "result is : " << endl;
list<IntArray>::iterator iter;
for( iter = combs.begin(); iter != combs.end(); iter++ )
{
int j;
IntArray& array = *iter;
for(j=0;j<array.size();j++)
{

cout<<array[j]<<' ';
out<<array[j]<<' ';
}
cout<<endl;
out<<endl;

}
return ;

}
// 打印数
void Print1 (list<IntArray>& combs)
{


::ofstream out("array1.txt");
int ncount=0;
cout << "result is : " << endl;
list<IntArray>::iterator iter;
for( iter = combs.begin(); iter != combs.end(); iter++ ) ncount++;
{

{

cout<<ncount<<' ';
out<<ncount<<' ';
}
cout<<endl;
out<<endl;

}
return ;

}


void Filter( list<IntArray>& combs)
{
IntArray temp;
list<IntArray>::iterator iter;
for( iter = combs.begin(); iter != combs.end();iter++)
{
IntArray& array = *iter;
// 下面这个二重for循环用来求两辆相减的绝对值,并且把不重复的元素放在temp中
for( int i = 0; i < array.size(); i++ ) {
for( int j = i+1; j < array.size(); j++ ) { int d = abs(array[i] - array[j]);
{ // 如果在temp中找不到该差值
temp.push_back(d); // 则将该差值插入temp中
}
}
}


int count=0;
for( i = 0; i < temp.size(); i++ ) {
for( int j = i + 1; j < temp.size(); j++ ) {
if( temp[i] == temp[j] ) break;
}
if (j == temp.size() ) count++;
}

list<IntArray>::iterator old_iter;
if( count != 20) {
old_iter = iter;
iter++;
combs.erase(old_iter);
} else {
iter++;
}
}
}


int main()
{
int m, n;
list<IntArray> result;
cout << "input m : ";
cin >> m;
cout << "input n : ";
cin >> n;
Combination( m, n, result );
Filter(result);
Print( result );
Print1(result );
return 0;
}
hdj0569 2001-12-01
  • 打赏
  • 举报
回复
把你的模板类一起贴出来
ratrat 2001-11-30
  • 打赏
  • 举报
回复
烦请各位帮我看一下下面2种写法错在那里?
第1种写法:
void Filter( list<IntArray>& combs)
{
IntArray temp;
list<IntArray>::iterator iter;
for( iter = combs.begin(); iter != combs.end();iter++)
{
IntArray& array = *iter;

for( int i = 0; i < array.size(); i++ ) {
for( int j = i+1; j < array.size(); j++ ) {
int d = abs(array[i] - array[j]);
if( find( temp.begin(), temp.end(), d) != temp.end() ) {
temp.push_back(d);
}
}
}
if( temp.size() != n ) //这里n怎样变,结果都没变化
{
list<IntArray>::iterator old_iter = iter;
iter++;
combs.erase(old_iter);
} else {
iter++;
}
}
}
第2种写法:
void Filter( list<IntArray>& combs)
{
IntArray temp;
list<IntArray>::iterator iter;
for( iter = combs.begin(); iter != combs.end();iter++)
{
IntArray& array = *iter;


for( int i = 0; i < array.size(); i++ ) {
for( int j = i+1; j < array.size(); j++ ) {
int d = abs(array[i] - array[j]);
{ temp.push_back(d); }
}
}

int count=0;
for( i = 0; i < temp.size(); i++ ) {
for( int j = i + 1; j < temp.size(); j++ ) {
if( temp[i] == temp[j] )break;
if (j == temp.size() ) count++;
}
}

list<IntArray>::iterator old_iter;
if( count != n)//这里n怎样变,结果都没变化

{
old_iter = iter;
iter++;
combs.erase(old_iter);
} else {
iter++;
}
masterz 2001-11-29
  • 打赏
  • 举报
回复
int arrayA[]={23,13,42,98,23,13,13,56,42,87,42,56,42};
int getuniquenum()
{
int num=sizeof(arrayA)/sizeof(int);
int *b=new int[num];
int i;
b[0]=arrayA[0];
int j=1;
bool bexist=false;
for(i=1;i<num;i++)
{
bexist=false;
for(int k=0;k<j;k++)
{
if(arrayA[i]==b[k])
{
bexist=true;
break;
}
}
if(bexist==false)
{
b[j]=arrayA[i];
j++;
}
}
CString strmsg;
strmsg.Format("unique number :%d",j);
AfxMessageBox(strmsg);
delete b;
return j;
}
greenyard 2001-11-29
  • 打赏
  • 举报
回复
void search(int nItem,int nStart,int& nCount)
{
for (int j = nStart; j < nCount; j++)
{
if (nItem = arrayA[j])
{
for (int k = nCount; k > j; k--)
{
arrayA[k-1] = arrayA[k];
}
nCount--;
}
}
};
for (int i=0; i < nCount; i++)
{
search(arrayA[i],i+1,nCount);
}
shupianbird 2001-11-29
  • 打赏
  • 举报
回复
自己做个集合类,提供与数组的转换,估计可以有点意思

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧