C++全排列怎么弄

C++全排列怎么弄,第1张

你的全排列算法不成立,我给你一个全排列的例子,你看看吧.

#include<iostream>

#include<cstring>

using namespace 圆宏举std

static int count=0

void Swap(char *a,char *b)

{

 char tmp=*a

 *a=*b

 *b=tmp

}

void AllRange(char *pszStr,int k,int m)

{

 if(k==m)

 {

 橘碧绝桥 count++

   cout<<pszStr<<endl 

 }

 else

 {

  for(int i=ki<=mi++)

  {

   Swap(pszStr+i,pszStr+k)

   AllRange(pszStr,k+1,m)

   Swap(pszStr+i,pszStr+k)

  }

 }

}

int main()  

{  

 int n

 cin>>n

 char *szTextStr

 sprintf(szTextStr,"%d",n)

 cout<<szTextStr<<"的全排列如下:"<<endl  

 AllRange(szTextStr,0,strlen(szTextStr)-1)

 cout<<"共"<<count<<"个"<<endl 

 return 0  

}

你的程序在swap()函数中只是将形参进行了值的对调,对实参无任何影响.

解决上述问题有两个方法:

1.正如楼大码纤上所说的,在C++环境下,可以将swap的两个参数滚仿改成引用类型,这样对它们的 *** 作将实际作用于实参,实现如下:

函数定义:swap(int &a,int &b)

函数调用示例:swap(*(p+k)*(p+i))其中p是指针,k,i是整形偏移量.

2.在纯C环境下,可以将swap的两个参数改为模拿指针类型,而在函数内部使用对其指向的地址中数据的解引用 *** 作,实现对原变量的对调 *** 作,实现如下:

函数定义:

swap(int *a,int *b)

{int t

t=*a

*a=*b

*b=t

}

函数调用示例:swap(p+k,p+i)其中p是指针,k,i是整形偏移量.

你的程序中还有两处涉及到指针使用的错误,我把改过的程序贴上来,错误已在注释中标注.

#include "stdio.h"

swap(int *a,int *b)

{

int t

t=*a

*a=*b

*b=t

}

perm(int *p,int k,int n)

{

int i

if(k==n-1)

{

for(i=0i<ni++)

printf("%d",*(p+i))

printf("\n")

}

else

{

for(i=ki<ni++)

{

swap((p+k),(p+i))

perm(p,k+1,n)//原为perm(*p,k+1,n).在此应传递的是指针p指向的地址,而不是该地址中的内容.

swap((p+k),(p+i))

}

}

}

main()

{

int i,list[3],*p

for(i=0i<3i++)

list[i]=i+1

p=list//原为p=list[0].这里应将数组list的首地址赋值给指针p,所以就写成p=list或p=&list[0].

perm(p,0,3)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8241687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存