社区
C语言
帖子详情
求一简单算法
阳春面0513
2004-05-05 04:19:27
如何将A,B,C,D按不同的出现次序全部列举出来。
谢谢!
...全文
41
26
打赏
收藏
求一简单算法
如何将A,B,C,D按不同的出现次序全部列举出来。 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
几个推荐
算法
的java实现
java实现的几个推荐
算法
:slopeone SVD,RSVD,ItemNeighborSVD 内有readme,相关内容在blog.csdn.net/lgnlgn
MoreWindows白话经典
算法
之七大排序(高清版)
这是本人在研一上课时所整理的文档,包括冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法,这些文章不仅使我在考试中取了不错的成绩,也为后来顺利面过迅雷,腾讯,微软打下了良好的基础,现在整理成电子书形式,希望能对大家有所帮助。
1000多种java
算法
大全源码包
1000多种java
算法
大全源码包
MD5加密
算法
MD5加密
算法
源代码
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章