当前位置:  编程技术>c/c++/嵌入式
本页文章导读:
    ▪产生所有排列---字典顺序-----2013年1月23日             问题描述:以字典顺序产生所有排列。假定集合set是连续的并且按从小到大顺序排列好了的,并且有n个元素。       思路:算法的思路分成两个部分:A是递归产.........
    ▪C判断一个数是不是素数      for(i=2;i<n/2;i++){if(n%i==0){   return 0;}return 1;}本文来源于http://code.niuc.org/thread-4430-1-1.html,转载请注明出处。本文链接......
    ▪【C开发】无限循环 while(1) 和 for(; ;)      无限循环有两种常用的方法:while(1) 和 for(; ; ) 。两种方法的效果一样,相比之下,哪种更好些?编译后代码对比:1、while( 1 );00401028 mov eax,10040102D test eax,eax0040102F je main+23h (00401033)00401031 jmp ma.........

[1]产生所有排列---字典顺序-----2013年1月23日
    来源:    发布时间: 2013-10-17

       问题描述:以字典顺序产生所有排列。假定集合set是连续的并且按从小到大顺序排列好了的,并且有n个元素。

       思路:算法的思路分成两个部分:A是递归产生以某个数字开头的排列,B是调用A来依次生成  1为第一位的所有排列,2为第一位的所有排列,....n为第一位的所有排列。

       下面是A部分的详细思路:

        1.以1234为例子。从右到左来寻找< (j=i+1,i>0)。

        2.接着再从右到左查找第一个比大的元素,然后将二者交换位置,再将到集合末尾逆序。这样就找到了1234的按字典顺序的下一个元素。

        3.递归进行。要注意递归的一个关键就是递归的结束条件。这里,以1开头的排列的最后一个数是1432,也就是说最后一个元素到第2个元素(第一个元素为1,肯定不能动)都没有<,也就是说,第二位及以后的元素都按照逆序排列好了,也就是找到了最后一个元素。这就是递归结束的条件。

        A部分的代码如下:

1 //find out all of the permutation in the set with first element 1 to n.
2 void find_next()
3 {
4 set_print();
5 int index_i,index_j,index_k;
6 flag=0;
7 for(index_i=n-2;index_i>0;index_i--)
8 if(set[index_i]<set[index_i+1])
9 {
10 index_j=index_i+1;
11 flag=1;
12 break;
13 }
14 if(flag==0)
15 return ;
16 for(index_k=n-1;index_k>0;index_k--)
17 if(set[index_k]>set[index_i])
18 break;
19 swap(&set[index_i],&set[index_k]);
20 reverse(index_j,n-1);
21
22 find_next();
23 }

 

       下面是B部分的详细思路:        

       1.B部分的算法主要负责执行A算法之后的增大首位的转折点,举个例子,就是1432的下一个元素是2134,从首位是1变到了首位是2。

       2.当A算法执行完后,元素是1432,这时,将第4位与第1位交换,就会得到2431,那么,很容易看出除了第一位之外其余都是按照逆序排列的,2431肯定不是1432的下一个数,2431与1432之间肯定还存在有符合条件的排列。于是,将除了第一位之外的元素逆序,就可达到目的,即2134。这才是1432的下一个元素。

       3.当到达2431后,即2开头的最后一个元素,又将第3位与第一位交换,再将首位之后的元素逆序,即可得到3开头的第一个数。

       4.那么,可以总结出,当首位为1时,就将最后一位与首位交换;当首位为2时,就将倒数第2位与首位交换;当首位为3时,就将倒数第3位与首位交换.....依次类推。这其中的道理很容易想明白。这样持续n次,所有结果就都得到了。

       B部分的代码如下:

1 int count=1;
2 int i=n-1;
3 while(i>=0)
4 {
5 set[0]=count++;
6 find_next();
7 swap(&set[0],&set[i]);
8 reverse(1,n-1);
9 i--;
10 }

 

      完整的代码如下:

1 #include <stdio.h>
2 #define MAX 1000
3
4 int n=4;
5 int set[MAX]={1,2,3,4};

    
[2]C判断一个数是不是素数
    来源:    发布时间: 2013-10-17

for(i=2;i<n/2;i++){
if(n%i==0){
   return 0;
}
return 1;
}

本文来源于http://code.niuc.org/thread-4430-1-1.html,转载请注明出处。

本文链接


    
[3]【C开发】无限循环 while(1) 和 for(; ;)
    来源:    发布时间: 2013-10-17

无限循环有两种常用的方法:

while(1) 和 for(; ; ) 。

两种方法的效果一样,相比之下,哪种更好些?

编译后代码对比:

1、while( 1 );

00401028 mov eax,1
0040102D test eax,eax
0040102F je main+23h (00401033)
00401031 jmp main+18h (00401028)

 2、for( ; ; );

00401033 jmp main+23h (00401033)

对比发现,for(; ;)指令少,不占用寄存器,而且没有判断、跳转,比while( 1 )要好一些。

 

PS:在VC6.0中,设断点调试,菜单View -> Debug Windows ->  Disassembly即可查看编译后代码。

 

 

 

本文链接


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3