欢迎来到天天文库
浏览记录
ID:31578631
大小:77.00 KB
页数:6页
时间:2019-01-13
《有重复元素的排列问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、有重复元素的排列问题一问题描述:设R={r1,r2,……rn}是要进行排列的n个元素,其中r1,r2……rn元素可能相同,请设计出一个算法,列出R中元素的所有不同排列。在给定的n以及待排列的n个元素,计算出这n个元素的所有不同排列。二要求输入输出:输入:第一行是元素个数n,1《=n《=15,接下来的1行是待排列的n个元素,元素中间不要加空格。输出:程序运行结束时,将计算出n个元素的所有不用排列,最后1行中的数是排列总数。例如:Input4aaccoutputaaccacacaccacaaccacaccaa6三设计概要:1)数据类型定义:intj=0定义j初始为0,用来计数总共排列数i
2、ntn输入排列元素的个数charlist[]定义数组list[]存放排列元素intk;intm数组中元素第k位到第m位的排列intflag标识符2)程序流程图:voidPerm(intk,intm)6k==mYNi=kprintf(“%s”,list);不存在k<=j
3、个元素待排列,递归产生排列for(从第k个直到第m个元素){flag=0;for(p=k;p
4、的实现在这判断上考虑欠缺,导致再运行通过后进行测试时出现了和预期结果不同的情况,经思考后修改最终实现了该算法。2)由于该程序的算法实现起来比较简单,对算法的时间和空间要求也比较低,所以也无需再想去改进算法的时空分析复杂度。3)在选用测试用例时,运用白盒测试法的覆盖来测试,选用了从1个元素到多个元素,从全不相同元素到有重复元素等来进行测试,所以测试用例应该得当。4)在进行调试时,遇到最多的首先就是小小的符号问题出错误,比如漏了分号,中英符号混了,从而出现了编译错误,这告诉我平时编写代码时要养成良好的习惯,例如在符号问题,大括号问题等;其次就是程序上出现了问题,包括了对算法考虑得不周全,
5、例如边界问题等等;有时会出现修改了某处错误,但新的错误又出现了,所以在调试过程中,应首先避免了符号上的错,然后再从全局上先去考虑下出错原因,再根据出错点进行修改。六测试结果:6七源程序:#include"stdio.h"intj=0;voidmain()//main函数,调用swap和perm{intn;voidSwap(char&a,char&b);voidPerm(charlist[],intk,intm);scanf("%d",&n);charlist[16];scanf("%s",list);Perm(list,0,n-1);printf("%d",j);}voidSwa
6、p(char&a,char&b)//交换元素{chartemp=a;a=b;b=temp;}6voidPerm(charlist[],intk,intm)//产生list[k:m]的所有排列{inti,p;intflag;voidSwap(char&a,char&b);if(k==m){//只剩下一个元素for(i=0;i<=m;i++)printf("%c",list[i]);j++;printf("");}else//还有多个元素待排列,递归产生排列for(i=k;i<=m;i++){flag=0;for(p=k;p
7、ag=1;}if(flag==1)continue;Swap(list[k],list[i]);Perm(list,k+1,m);Swap(list[k],list[i]);}}6
此文档下载收益归作者所有