社区
C语言
帖子详情
求一简单算法
阳春面0513
2004-05-05 04:19:27
如何将A,B,C,D按不同的出现次序全部列举出来。
谢谢!
...全文
22
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)
(
算法
)通俗易懂的字符串匹配KMP
算法
及求next值
算法
在考研备考中,参考严奶奶的教材,我也是在关于求next值的
算法
中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。 以下的顺序为 1、最基本的朴素
算法
2、优化的KMP
算法
3、应
算法
...
几种常见的
简单
算法
几种常见的
简单
算法
二分查找问题描述具体实现欧几里得
算法
(辗转相除法)问题描述具体实现幂运算问题描述具体实现 首先祝大家1024程序员节快乐,容许我水一篇文章,这里主要介绍几种
简单
的
算法
,并结合具体事例看看...
KNN
算法
(一) KNN
算法
原理
KNN可以说是最
简单
的分类
算法
之一,同时,它也是最常用的分类
算法
之一,注意KNN
算法
是有监督学习中的分类
算法
,它看起来和另一个机器学习
算法
Kmeans有点像(Kmeans是无监督学习
算法
),但却是有本质区别的。...
KMP
算法
最浅显理解——一看就明白
KMP
算法
看懂了觉得特别
简单
,思路很
简单
,看不懂之前,查各种资料,看的稀里糊涂,即使网上最
简单
的解释,依然看的稀里糊涂。 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥。 这里不扯概念,只讲...
表达式求值
算法
总结
表达式求值
算法
表达式求值,一般采用栈和队列的方式来求值,下面介绍...当输入 3 * ( 4 - 1 * 2 ) + 6 / ( 1 + 1 )时,为
简单
方便,我们输入时,按照字符的顺序一个一个的处理,比如 ch = getchar() 然后根据c...
C语言
69,380
社区成员
243,074
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章