求一简单算法

阳春面0513 2004-05-05 04:19:27
如何将A,B,C,D按不同的出现次序全部列举出来。
谢谢!
...全文
22 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixiaohua 2004-05-06
  • 打赏
  • 举报
回复
我贴的那个不错,
不过不是我写的.
:)
阳春面0513 2004-05-06
  • 打赏
  • 举报
回复
呵呵,如果实用的话我会选择STL的那个,学习的话其他的都可以看看
谢谢大家
freefalcon 2004-05-05
  • 打赏
  • 举报
回复
晕,楼主非要现成的一点都不需改动的程序吗?
唉,不过是C++的风格罢了
把变量声明都提到前面去,头文件该加的也都加上...................
woaichenyu 2004-05-05
  • 打赏
  • 举报
回复
还是cngdzhang()厉害
woaichenyu 2004-05-05
  • 打赏
  • 举报
回复
freefalcon(心宇) ,
你的程序我的TC下面调试过,至少有200多处错误。
weixiaohua 2004-05-05
  • 打赏
  • 举报
回复
上面的程序已经很不错了,理论上可以接受任意长度的字符串或者数字,
但是速度方面真的很慢...................................................................................................................................................................................................................................................
arrorbai 2004-05-05
  • 打赏
  • 举报
回复
上面的算法程序都不是健壮的,应该写一个给出任意一个字符串,输出它的所有组合就WONDERFUL了
weixiaohua 2004-05-05
  • 打赏
  • 举报
回复
该问题不用递规比较复杂!
这是数据结构C++语言描述里相同问题的解决方法!
const int UpperLimit = 5;
void copy(int x[], int y[], int n)
{
for(int i=0; i<n; i++)
x[i] = y[i];
}
void permute(int permlist[], int start, int n)
{
int tmparr[UpperLimit];
int temp, i;
if(start == n-1)
{
for(i=0; i<n; i++)
cout << permlist[i] << ' ';
cout << endl;
}
for(i=start; i<n; i++)
{
temp = permlist[i];
permlist[i] = permlist[start];
permlist[start] = temp;
copy(tmparr, permlist, n);
permute(tmparr, start+1, n);
}
}
int main()
{
int permlist[UpperLimit];
int n, i;
cout << "Enter a number 'n' between 1 and" << UpperLimit << ":";
cin >> n;
for(i=0; i<n; i++)
permlist[i] = i+1;
cout << endl;
permute(permlist, 0, n);

system("PAUSE");
return 0;
}
ghiewa 2004-05-05
  • 打赏
  • 举报
回复
呵呵 弄错个地方
vector <char> v1;
vector <char>::iterator Iter1;//上面这里错了

v1.push_back( 'A' );
v1.push_back( 'B' );
v1.push_back( 'C' );
v1.push_back( 'D' );

int iii = 1;
while ( iii <= 4 ) {
next_permutation ( v1.begin ( ) , v1.end ( ));
cout << "After another next_permutation of vector v1,\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ;Iter1 ++ )
cout << *Iter1 << " ";
cout << ")." << endl;
iii++;
}
ghiewa 2004-05-05
  • 打赏
  • 举报
回复
C++

vector <char> v1;
vector <int>::iterator Iter1;

v1.push_back( 'A' );
v1.push_back( 'B' );
v1.push_back( 'C' );
v1.push_back( 'D' );

int iii = 1;
while ( iii <= 4 ) {
next_permutation ( v1.begin ( ) , v1.end ( ));
cout << "After another next_permutation of vector v1,\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ;Iter1 ++ )
cout << *Iter1 << " ";
cout << ")." << endl;
iii++;
}

试试使用 stl标准库
vcchunhong 2004-05-05
  • 打赏
  • 举报
回复
简单啊
搞一个数组
cyh811122 2004-05-05
  • 打赏
  • 举报
回复
我这有一个简单的算法,不过我的题目要求是一个二位除以一个二位数等于一个三位除一个三位数,这里要求的二位数和三位数上的个个位数不能有重复出现的数字,比如124是可以的,但122不可以。源代码如下:(我想这个程序应该比你的要求还复杂,如果不按我下面的算法来做的话得写九层循环呢,那速度你可想而知了)
#include "conio.h"
#include "stdio.h"
int iszheng(double t)
{
if(!(t-(int)(t))&&(t>100)&&(t<999))
return 1;
else
return 0;


}
main()
{
int a[10]={0},i,j,k,v,t,m,n=1;
double vv;
int nn=0;
clrscr();
for(i=10;i<98;i++)

for(j=10;j<98;j++)
{for(k=102;k<987;k++)
{
vv=j*1.0*k/i;
if(iszheng(vv))
{v=(int)vv;
for(m=0;m<10;m++)
a[m]=0;
n=1;
a[i/10]=1;
a[i%10]=1;
a[j/10]=1;
a[j%10]=1;
a[k/100]=1;
a[k/10%10]=1;
a[k%10]=1;
a[v/100]=1;
a[v/10%10]=1;
a[v%10]=1;
for(m=0;m<10;m++)
if(a[m]==0)
n=0;
if(n)
{printf("%d/%d=%d/%d\t",i,j,k,v);
nn++;
}
}

}

}
printf("end %d",nn);
getch();
}
cngdzhang 2004-05-05
  • 打赏
  • 举报
回复
刚才调试的时候
char buf[MAXLEN+1];
写成了
char buf[MAXLEN];
导致结果错误(少了一个字节放'\0'),
郁闷...........

总算好了:)

zhouqingyuan 2004-05-05
  • 打赏
  • 举报
回复
#include <iostream.h>

void permutation(char a[],int size,char b[],int r,int m,int flag[])
{
if(m==r)
{
for(int i=0;i<m;i++)
cout<<b[i]<<' ';
cout<<endl;
return;
}
else
{
for(int j=0;j<size;j++)
{
if(flag[j]==0)
{
b[m]=a[j];
flag[j]=1;
permutation(a,size,b,r,m+1,flag);
flag[j]=0;
}
}
}
}
void main(void)
{
char a[4]={'A','B','C','D'};
char b[4];
int flag[4]={0};
permutation(a,4,b,4,0,flag);
}



freefalcon 2004-05-05
  • 打赏
  • 举报
回复
实质上还是循环啊
而且递归由于有函数调用的开销,效率会更低一些
cngdzhang 2004-05-05
  • 打赏
  • 举报
回复
给个递归的

#include <stdio.h>

//构造的串的长度
#define MAXLEN 4

//使用几个字母
#define CHARACTER 4

char buf[MAXLEN+1];
char ch[CHARACTER];
int total;

void make(int n)
{
int i;
if(n==MAXLEN)
{
buf[n]='\0';
printf("%s\n",buf);
total++;
}
else
{
for(i=0;i<CHARACTER;i++)
{
if(ch[i]==1) continue;
buf[n]=i+'A';
ch[i]=1;
make(n+1);
ch[i]=0;
}
}
}

void main()
{
int i;
for(i=0;i<CHARACTER;i++)
{
ch[i]=0;
}
total=0;
make(0);
printf("total=%d\n",total);
}
阳春面0513 2004-05-05
  • 打赏
  • 举报
回复
可不可以用回溯或者递归?
freefalcon 2004-05-05
  • 打赏
  • 举报
回复
不可能不用循环,因为你要“全部列出”
zhouqingyuan 2004-05-05
  • 打赏
  • 举报
回复
不就是一个排列组合吗?
zd6437 2004-05-05
  • 打赏
  • 举报
回复
是啊
加载更多回复(6)

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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