求大神相助!用 c++ 写的关于组合排列的程序,编译和运行都没错误,就是运行的时候不出结果。谢大神们!!
程序代码:
#include <iostream> using namespace std; #define MaxN 10 class ZUHEPAILIE{ public: ZUHEPAILIE(); int choice(); void putdata(); void permute(int pos,int n,int r); void combine(int pos,int h,int n,int r); int n; int r; char used[MaxN]; int p[MaxN]; char s[MaxN]; char str[MaxN]; }; ZUHEPAILIE::ZUHEPAILIE() { } int ZUHEPAILIE::choice() { int choose; cout<<"******************************************************************************"<<endl; cout<<"输入序号1则为输入"<<endl; cout<<"输入序号2则为组合"<<endl; cout<<"输入序号3则为排列: "<<endl; cout<<"输入除数字1、2、3之外的任意键则退出: "<<endl; cout<<"******************************************************************************"<<endl; cout<<"请输入序号进行操作: "<<endl; cin>>choose; return choose; } void ZUHEPAILIE::putdata() { cout<<"您将输入一个长度为n(用户自定义)的字符串\n"<<"请输入字符串长度n:"<<endl; cin>>n; cout<<"请输入"<<n<<"个字母(输入时请勿输入相同字母):\n";//最多输入多少个由 MaxN 的值决定 cin>>str; strcpy(s,str); cout<<"请输入需要操作的字母数r:\n"<<endl; cin>>r; } //从n个元素中选r个进行排列 void ZUHEPAILIE::permute(int pos,int n,int r) { int i; /*如果已是第r个元素了,则可打印r个元素的排列 */ if(pos == r) { for(i=0; i<r; i++) cout<<s[p[i]]; cout<<endl; return; } for (i=0; i<n; i++) { if(!used[i]) { /*如果第i个元素未用过*/ /*使用第i个元素,作上已用标记,目的是使以后该元素不可用*/ used[i]++; /*保存当前搜索到的第i个元素*/ p[pos] = i; /*递归搜索*/ permute(pos+1,n,r); /*恢复递归前的值,目的是使以后改元素可用*/ used[i]--; } } } //从n个元素中选r个进行组合 void ZUHEPAILIE::combine(int pos,int h,int n,int r) { int i; /*如果已选了r个元素了,则打印它们*/ if (pos == r) { for(i=0; i<r; i++) cout<<s[p[i]]; cout<<endl; return; } for(i=h; i<=n-r+pos; i++) /*对于所有未用的元素*/ { if (!used[i]) { /*把它放置在组合中*/ p[pos] = i; /*使用该元素*/ used[i]++; /*搜索第i+1个元素*/ combine(pos+1,i+1,n,r); /*恢复递归前的值*/ used[i]--; } } } int main() { ZUHEPAILIE zuhepailie=ZUHEPAILIE(); cout<<" 排列组合生成器 "<<endl; while(1) { switch(zuhepailie.choice()) { case 1:cout<<"输入n个字母,和整数r (r<=n): "<<endl; zuhepailie.putdata(); break; case 2: cout<<"n个字母中选择r个字母形成的所有组合为: "<<endl; (0,0,zuhepailie.n,zuhepailie.r); break; case 3: cout<<"n个字母中选择r个字母形成的所有排列为: "<<endl; zuhepailie.permute(0,zuhepailie.n,zuhepailie.r); break; default: break; } } return 0; }