1 汉诺塔问题

2 约瑟夫环

3 求“斐波纳契数列:1,1,2,3,5,8,13,21..."函数:递归与非递归

4 判断一个数是否是 2的幂次数:

5 计算一个整数的二进制数的 1的个数num

6 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。 ----像这种要求时间复杂度的 常常需要交换的算法

===========================================================================================

1 汉诺塔问题

//第一,把X上的n-1个盘通过Z移动到Y。

第二,把X上的最下面的盘移到Z。

//第三,因为n-1个盘全在Y上了,所以把Y当做X重复以上步骤就好了。递归中会保存数据

void moveNext( char pre, char next ){    cout<
<<"-->"<
<

2 约瑟夫环

首先建立一个 首尾相连的循环链表,for循环定义计算器,到达m改变链表的连接关系。

直到 最后剩下一个结点,pre=purnode。

typedef struct node {    int num;    struct node *next;}LinkNode;
LinkNode * create_link( int num ){    LinkNode *p,*current,*head;   // p用来循环,current用来记录当前的位置。head(第一个数)用来返回一个链表    p=(LinkNode*)malloc(sizeof(LinkNode));    p->num=1;    p->next=NULL;    head=p;    current=p;    for(int i=2;i<=num;i++)    {        //生成新的结点---建立连接----转移到下一个        p=(LinkNode*)malloc(sizeof(LinkNode));        p->num=i;        p->next=NULL;        current->next=p;        current=p;    }    current->next=head;     //链表的rail指向head,构成循环(循环列表list)。    return head;}void make_play( LinkNode *link,int mcode ){    assert(link!=NULL&&mcode!=0);    LinkNode *pLink=link,*pPre=NULL;   //错误:要给pre赋值才能使用。    LinkNode *pDelte;                  //删除节点---free(标记结点)    cout<<"亲,游戏开始了!"<
next; } pDelte=pLink; cout<<"出列的是"<
num<
next=pLink->next; pLink=pPre->next; free(pDelte); } cout<<"最后出列的是:"<
num<

3 求“斐波纳契数列:1,1,2,3,5,8,13,21..."函数:递归与非递归

主要就是 初始化(退出条件)和循环条件转移(递归关系)的一个转换的关系。

int fib( int n ){    /*if(n==1||n==2)    {    return 1;    }    else    {    return fib(n-1)+fib(n-2);    }*/    if(n<=2)    {        return 1;    }    int valN1,valN2,sumN;         //是不是可以写成static形式的    valN1=1;    valN2=1;    //sum ,n1,n2往后移动位置    for(int i=1;i<=n-2;i++)      //计算的次数    {        sumN=valN1+valN2;        valN2=valN1;        valN1=sumN;    }    return sumN;}

4 判断一个数是否是 2的幂次数:0==(a[i]&(a[i]-1)

int find2power( int a[] ,int len){    int count=0;    for(int i=0;i

5 计算一个整数的二进制数的 1的个数num

统计一个整数的二进制数的 1的个数: num&1(一次统计最右边的那个数值是否是1)

int num1OfBinery( int num ){    int count=0;    while(num)    {        if(num&1)        {            count++;        }        num>>=1;   //向右移动,除以2    }    return count;}

6 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

----像这种要求时间复杂度O(n)的 常常需要交换的算法:添加一个计算当前遇到的奇数个元素的mark标记(标志下一个遇到的奇数应该插入的位置),遇到奇数的话---swap(i,mark)

void swapElement( int arr[], int i, int mark ){    int tmp;    tmp=arr[i];    arr[i]=arr[mark];    arr[mark]=tmp;}void printArrray( int arr[], int num ){    cout<<"输出的数组是:"<

===========================================================================

测试的代码:

/*    int n;    printf("请输入要移动的块数:");    scanf("%d",&n);    hanio(n,'X','Y','Z');*/    int num=7;    //cout<
<