C语言学习3

1、温故知新

#include <stdio.h>
int main()
{
    int ret = 0;
    int ch = 0;
   char password[20] = {0};
   printf("请输入密码:");
   scanf("%s",password);
   //缓冲区还剩余一个'\n'
   //读取下一个'\n'
   while ((ch = getchar()) != '\n')
   {
       ;
   }
   printf("请确认(Y/N):");
   ret = getchar();//Y/N
   if(ret == 'Y')
   {
       printf("确认成功\n");
   }
   else
    {
        printf("放弃确认");
   }
	return 0;
}
#include <stdio.h>
int main()
{
    int ch = 0;
    while((ch = getchar())!= EOF)
    {
        if(ch<'0' || ch>'9')
        {
            continue;
            putchar(ch);
        }
    }
	return 0;
}

2、for循环

语法
for(表达式1; 表达式 2;表达式3)
循环语句
表达式1表达式1为初始化部分,用于初始化循环变量的。表达式2 表达式2为条件判断部分,用于判断
循环时候终止。表达式3 表达式3为调整部分,用于循环条件的调整。

例子:使用for循环打印1-10的数字

#include <stdio.h>
int main()
{
    int i = 0;//初始化
    for(i=1;i<=10;i++)
    {
        printf("%d",i);
    }
	return 0;
}

代码对比,输出的结果不同
在这里插入图片描述
for语句的循环控制变量一些建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
例子1

#include <stdio.h>
int main()
{
    int i = 0;
    for(i = 0;i<10;i++)
    {
        if(i = 5)
            printf("haha\n");
        printf("hehe\n");
    }
	return 0;
}

例子2

#include <stdio.h>

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int i= 0;
    //10次打印
    for(i=0;i<10;i++)
    {
        printf("%d",arr[i]);
    }
	return 0;
}

一些for循环的变种:

#include <stdio.h>

int main()
{

   //变种1 
   for(;;)//for循环的初始化、调整、判断都可以省略,但是如果for宣贯的判断被省略,那判断条件就是恒为正,建议不要随便省略
   {
       printf("hehe\n");
   }
   //变种2
   int x,y;
   for(x = 0,y = 0;x<2 && y<5; ++x,y++)
   {
       printf("hehe\n");
   }
	return 0;
}
#include <stdio.h>
int main()
{
   int i = 0;
   int j = 0;
   for(i = 0;i<10;i++)
   {
       for(j=0;j<10;j++)
       {
           printf("hehe\n");
       }
   }
	return 0;
}

看看这个要循环多少次

#include <stdio.h>
int main()
{

   int i = 0;
   int j = 0;
   for(i = 0,j = 0;j = 0;i++,j++)
    j++;
	return 0;
}

答案是0次

3、do while循环

do语句的语法:
do
循环语句
while(执行语句);

例子:在屏幕上打印1-10

#include <stdio.h>

int main()
{

    int i = 1;
   do
   {
        printf("%d",i);
        i++;
   }
   while(i<=10);

	return 0;
}

4、习题练习

(1)计算n的阶乘
#include <stdio.h>
int main()
{
    int i = 0;
    int n = 0;
    int sum = 1;
    printf("请输入一个数:");
    scanf("%d",&n);
   for(i=1;i<=n;i++)
   {
        sum = sum * i;
   }
    printf("sum= %d\n",sum);
	return 0;
}
(2)计算1!+2!+3!+…+10!
#include <stdio.h>

int main()
{

    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
//    printf("请输入一个数:");
//    scanf("%d",&n);
    for(n=1;n<=10;n++)
    {
        ret = 1;
       for(i=1;i<=n;i++)
        {
        ret = ret * i;
        }
        //n的阶乘
        sum = sum + ret;
    }
    printf("sum= %d\n",sum);
	return 0;
}

优化后的代码

#include <stdio.h>

int main()
{

    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
    for(n=1;n<=10;n++)
    {
        ret = ret * n;
        //n的阶乘
        sum = sum + ret;
    }
    printf("sum= %d\n",sum);
	return 0;
}
(3)在一个有序数组中查找具体的某个数字n。编写int binsearch(int X, int v[], int n);功能:在v[0]<=v[1]<=v[2]<= …<=v[n-1]的数组中查找x。
#include <stdio.h>

int main()
{

    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int k=7;
    //写一个代码,在arr数组(有序的)中找到7
    int i=0;
    int sz =sizeof(arr)/sizeof(arr[0]);
    for(i=0;i<sz;i++)
    {
        if(k == arr[i])
        {
            printf("找到了,下标是:%d\n",i);
            break;
        }
    }
    if(i == sz)
    printf("找不到\n");
	return 0;
}

二分法查找数字

#include <stdio.h>

int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    int k = 7;
    int left = 0;//左下标
    int right =sz-1;//右下标
   while(left<=right)
   {
        int mid = (left+right)/2;
       if(arr[mid]>k)
       {
           right=mid -1;
       }
       else if(arr[mid]<k)
       {
           left = mid+1;
       }
       else
        {
            printf("找到了,下标是%d\n",mid);
            break;
        }
   }
    if(left>right)
    {
        printf("找不到\n");
    }
	return 0;
}
(4)编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h>
#include <string.h>

int main()
{
    //welcome to bit !!!!
    //###################
    //w#################!
    //we###############!!
    //wel#############!!!
    //....
    //welcome to bit !!!!
    char arr1[]="welcome to bit !!!!";
    char arr2[]="###################";
    int left = 0;
//    int right = sizeof(arr1)/sizeof(arr1[0]-2);
    int right = strlen(arr1)-1;
    while(left<=right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n",arr2);
        left++;
        right--;
    }
     return 0;
}
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

int main()
{
    //welcome to bit !!!!
    //###################
    //w#################!
    //we###############!!
    //wel#############!!!
    //....
    //welcome to bit !!!!
    char arr1[]="welcome to bit !!!!";
    char arr2[]="###################";
    int left = 0;
//    int right = sizeof(arr1)/sizeof(arr1[0]-2);
    int right = strlen(arr1)-1;
    while(left<=right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n",arr2);
        Sleep(1000);
        system("cls");//执行系统命令的一个函数--cls--清空屏幕
        left++;
        right--;

    }
    printf("%s\n",arr2);
     return 0;
}
(5)编写代码实现,模拟用户登录情景,并且只能登录三次。( 只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
#include <stdio.h>
int main()
{
    int i = 0;
    char password[20]={0};
    for(i=0;i<3;i++)
    {
        printf("请输入密码:");
        scanf("%s",&password);
        if(strcmp(password,"123456") == 0)//== 不能用来比较两个字符串是否相等,应使用一个库函数--strcmp
        {
            printf("登录成功\n");
            break;
        }
        else
        {
            printf("密码错误\n");
        }
    }
    if(i == 3)
        printf("三次密码均错误,退出程序\n");
     return 0;
}
(6)写代码实现三个数从大到小输出
#include <stdio.h>

int main()
{
    int a,b,c = 0;
    printf("请输入三个数a,b,c:");
    scanf("%d %d %d",&a,&b,&c);
    //算法实现 a中放最大值 b次之 c最小值
    if(a<b)
    {
       int tmp = a;
       a = b;
       b = tmp;
    }
    if(a<c)
    {
        int tmp = a;
        a = c;
        c = tmp;
    }
    if(b<c)
    {

        int tmp = b;
        b = c;
        c = tmp;
    }
    printf("%d %d %d\n",a,b,c);

     return 0;
}
(7)打印1-100之间所有3的倍数的数字
#include <stdio.h>

int main()
{
    int i = 0;
    for(i=1;i<=100;i++)
    {
        if(i%3 ==0)
        printf("%d ",i);
    }

     return 0;
}

(8)给定两个数,求这两个数的最大公约数
#include <stdio.h>
int main()
{
    int m = 0;
    int n = 0;
    int r = 0;
    scanf("%d%d",&m,&n);
    while(r=m%n)
    {
        m = n;
        n = r;
    }
    printf("%d\n",n);
     return 0;
}
(9)打印1000年至2000年之间的闰年

写法一:

#include <stdio.h>

int main()
{
    int year = 0;
     int count = 0;
    for(year=1000;year<=2000;year++)
    {
        //判断year是否为闰年
        //能被4整除并且不能被100整除是闰年
        //能被400整除是闰年
        if(year%4==0 && year%100!=0)
        {
            printf("%d ",year);
            count++;
        }
        else if(year%400==0)
        {
            printf("%d ",year);
            count++;
        }
    }
    printf("\n count= %d\n",count);
     return 0;
}

写法二:

#include <stdio.h>
int main()
{
    int year = 0;
     int count = 0;
    for(year=1000;year<=2000;year++)
    {
        if((year%4==0)&&(year%100!=0)||(year%400==0))
            printf("%d ",year);
        count++;
    }
    printf("\n count= %d\n",count);
     return 0;
}
(10)打印100-200之间的素数

写法一:

#include <stdio.h>
int main()
{
    int i = 0;
    int count = 0;
    for(i=100;i<=200;i++)
    {
        //判断i是否为素数
        //素数判断的规则
        //1、试除法
        //产生2--i-1的数字
        int j=0;
        for(j=2;j<i;j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        if(j == i)
        {
            count++;
            printf("%d ",i);
        }
    }
    printf("\n count= %d \n",count);
     return 0;
}

写法二:

#include <stdio.h>
#include <math.h>
int main()
{
    int i = 0;
    int count = 0;
    for(i=100;i<=200;i++)
    {
        int j=0;
        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        if(j>sqrt(i))
        {
            count++;
            printf("%d ",i);
        }
    }
    printf("\n count= %d \n",count);
     return 0;
}

写法三:

#include <stdio.h>
#include <math.h>
int main()
{
    int i = 0;
    int count = 0;
    for(i=101;i<=200;i+=2)
    {
        int j=0;
        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j == 0)
            {
                break;
            }
        }
        if(j>sqrt(i))
        {
            count++;
            printf("%d ",i);
        }
    }
    printf("\n count= %d \n",count);
     return 0;
}
(11)下面代码的输出结果为 8
#include <stdio.h>

int main()
{
    int a=0,b=0;
    for(a=1,b=1;a<=100;a++)
    {
        if(b>=20)break;
        if(b%3 ==1)
        {
            b=b+3;
            continue;
        }
        b=b-5;
    }
    printf("%d\n",a);
     return 0;
}
(12)编写程序数一下1到100的所有整数中出现多少个数字9
#include <stdio.h>

int main()
{
    int i = 0;
    int count = 0;
    for(i=1;i<100;i++)
    {
        if(i%10 == 9)
            count++;
        if(i/10 == 9)
            count++;
    }
    printf("count = %d\n",count);
     return 0;
}
(13)分数求和:计算1/1-1/2+1/3-1/4+1/5… + 1/99- 1/100的值,打印出结果
#include <stdio.h>
int main()
{
    int i = 0;
    double sum = 0.0;
    int flag = 1;
    for(i=1;i<=100;i++)
    {
        sum+=flag*1.0/i;
        flag = -flag;
    }
    printf("%lf\n",sum);
     return 0;
}
(14)求10个整数中的最大值
#include <stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int max = arr[0];
    int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    for(i=1;i<sz;i++)
    {
        if(arr[i]>max)
        {
            max = arr[i];
        }
    }
    printf("max = %d\n",max);

     return 0;
}
(15)在屏幕上显示9*9乘法表
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1;i<=9;i++)
    {
        //打印一行
        int j = 1;
        for(j=1;j<=i;j++)
        {
            printf("%d*%d=%-2d ",i,j,i*j);
        }
        printf("\n ");
    }
     return 0;
}
(16)猜数字游戏(电脑会生成一个随机数,猜数字)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
    printf("********************************\n");
    printf("***** 1、玩游戏 0、退出游戏 ****\n");
    printf("********************************\n");
}
//RAND_MAX--32767
void game()
{
    //生成一个随机数
    int ret = 0;
    int guess = 0;
    ret = rand()%100+1;//产生一个1-100之间随机数
    //printf("%d\n",ret);
    //猜数字
    while(1)
    {
        printf("请猜数字(1-100之间):");
        scanf("%d",&guess);
        if(guess>ret)
        {
            printf("猜大了\n");
        }
         else if(guess<ret)
         {
             printf("猜小了\n");
         }
         else
         {
             printf("恭喜你猜对了\n");
             break;
         }
    }
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择:");
        scanf("%d",&input);
        switch(input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,请重新选择\n");
            break;
        }

    }while(input);
     return 0;
}

5、goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

下面是一个关机程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char input[20]={0};
    //shutdown -s -t 60
    //system()---执行系统命令
    system("shutdowm -s -t -60");
again:
    printf("请注意:你的电脑将在一分钟内关机,如果输入我是猪就取消关机\n 请输入");
    scanf("%s",input);
    if(strcmp(input,"我是猪") == 0)//比较两个字符串--strcmp
    {
        system("shutdown -a");
    }
    else
        {
            goto again;
        }
    return 0;
}

6、函数

(1)库函数

1.我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之 后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上( printf )。
2.在编程的过程中我们会频繁的做一些字 符串的拷贝工作( strcpy)。
3.在编程是我们也计算,总是会计算n的k次方这样的运算( pow)。
在这里插入图片描述
简单的总结, C语言常用的库函数都有:
      ●I0函数
      ●字符串操作函数
     ●字符操作函数
      ●内存操作函数
      ●时间/日期函数
      ●数学函数
      ●其他库函数

strcpy函数的使用:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[]="bit";
    char arr2[20]="#############";
    //strcpy--string copy--字符串拷贝
    strcpy(arr2,arr1);
    printf("%s\n",arr2);
    
    return 0;
}

memset函数的使用:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[]="hello word";
    memset(arr,'*',5);
    printf("%s\n",arr);
    return 0;
}

对于陌生的函数,可以自己查询对应的手册 库函数查询网址

(2)自定义函数

在这里插入图片描述

#include <stdio.h>

int get_max(int x,int y)
{
    if(x>y)
        return x;
    else
        return y;
}
int main()
{
//    char arr[]="hello word";
//    memset(arr,'*',5);
//    printf("%s\n",arr);
    int a=10;
    int b=20;
    int max =get_max(a,b);
    printf("max =%d\n",max);

    return 0;
}

写一个函数来交换两个变量:

#include <stdio.h>
#include <string.h>
void swap(int* pa,int *pb)
{
    int tmp = 0;
    tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
int main()
{
    int a=10;
    int b=20;
    printf("a= %d b=%d\n",a,b);
    swap(&a,&b);
    printf("a= %d b=%d\n",a,b);

}
(3)参数

实际参数(实参) :
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类
型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

形式参数(形参) :
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配
内存单元) ,所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在
函数中有效。

我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

(4)函数的调用

传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用
●传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
●这种传参方式可以让函数和函数外边的变量建立起正真的联系 ,也就是函数内部可以直接操
作函数外部的变量。

(5)例子

写一个函数可以判断一个数是不是素数

#include <stdio.h>
//是素数返回1,不是素数返回0
int is_prime(int n)
{
    //2-n-1
    int j = 0;
    for(j = 2;j<n;j++)
    {
        if(n%j == 0)
        return 0;
    }
    return 1;
}

int main()
{
    int i = 0;
    for(i=100;i<=200;i++)
    {
        //判断i是否为素数
        if(is_prime(i) == 1)
            printf("%d ",i);
    }
    return 0;
}

写一个函数可以判断一年是否为闰年

#include <stdio.h>

int is_leap_year(int y)
{
    if((y%4==0&&y%100!=0)||(y%400==0))
        return 1;
    else
        return 0;
}

int main()
{
    int year = 0;
    for (year=1000;year<=2000;year++)
    {
        //判断year是否为闰年
        if(1 == is_leap_year(year))
        {
            printf("%d ",year);
        }
    }

}

写一个函数,实现一个整形有序数组的二分查找。</font color >

#include <stdio.h>

int binary_search(int arr[],int k,int sz)
{
    //算法的实现
    int sz = sizeof(arr)/sizeof(arr[0]);
    int left = 0;
    int right =sz-1;

    while(left<=right)
    {
        int mid = (left+right)/2;
        if(arr[mid]<k)
        {
            left = mid+1;
        }
        else if (arr[mid]>k)
        {
            right = mid-1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

int main()
{
    //二分查找
    //在一个有序数组中查找具体的某个数
    //如果找到了返回,这个数的下标。找不到的返回-1

    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int k =7;
    int ret = binary_search(arr,k);
    if(ret == -1)
    {
        printf("找不到指定的数字\n");
    }
    else
    {
        printf("找到了,下标是:%d\n",ret);
    }
    return 0;
}

写一个函数,每调用一次这个函数,就会将nwhm的值增加1

#include <stdio.h>

void Add(int *p)
{
    (*p)++;
}

int main()
{
    int num = 0;
    Add(&num);
    printf("num = %d\n",num);
    Add(&num);
    printf("num = %d\n",num);
    Add(&num);
    printf("num = %d\n",num);
    return 0;
}
(6)函数的嵌套调用和链式访问

嵌套调用

#include <stdio.h>

void new_line()
{
    printf("hehe\n");
}

void three_line()
{
    int i = 0;
    for(i=0;i<3;i++)
    {
        new_line();
    }
}
int main()
{
    three_line();
    return 0;
}

链式访问

#include <stdio.h>
#include <string.h>

int main()
{
    int len = 0;
    len = strlen("abc");
    printf("%d\n",len);
    printf("%d\n",strlen("abc"));
    return 0;
}
(7)函数的声明和定义

函数声明:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3.函数的声明一般要放在头文件中的。

函数实现: 函数的定必是指函数的具体实现,交待函数的功能实现。

7、函数递归

(1)什么是递归?

程序调用自身的编程技巧称为递归( recursion) 。递归做为一 种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于:把大事化小递归的两个必要条件
●存在限制条件,当满足这个限制条件的时候,递归便不再继续。
●每次递归调用之后越来越接近这个限制条件。

最简单的递归:会存在栈溢出的现象

#include <stdio.h>

int main()
{
    printf("hehe\n");
    main();
    return 0;
}

在这里插入图片描述
接受一个整型值(无符号),按照顺序打印它的每- -位。例如:输入: 1234 ,输出1234。

#include <stdio.h>
#include <string.h>

void print(int n)
{
    if(n>9)
    {
        print(n/10);
    }
    printf("%d",n%10);
}
int main()
{
    unsigned int num =0;
    scanf("%d\n",&num);//1234
    //递归
    print(num);
    //print(1234)
    //print(123) 4
    //print(12) 3 4
    //print(1) 2 3 4
    return 0;
}

编写函数不允许创建临时变量,求字符串的长度。

#include <stdio.h>
#include <string.h>

int my_strlen(char* str)
{
    int count = 0;
    while(*str !='\0')
    {
        count++;
        str++;
    }
    return count;
}
int main()
{
    char arr[]="bit";
//    int len = strlen(arr);//求字符串长度
//    printf("%d\n",len);
//模拟实现了一个strlen函数
    int len =my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是一个元素的地址
    printf("len=%d\n",len);
    return 0;
}
(2)递归与迭代

A、求n的阶乘

#include <stdio.h>
#include <string.h>

int Facl(int n)
{
    if(n<=1)
        return 1;
    else
        return n*Facl(n-1);
}
int main()
{
    int n=0;
    int ret = 0;
    scanf("%d",&n);
    ret = Facl(n);
    printf("%d\n",ret);
    return 0;
}

B、求第n个斐波那契数。( 不考虑溢出)
  方法一:

#include <stdio.h>
#include <string.h>

//斐波那契数
//1 1 2 3 5 8 13 21 34 55 ......
int count = 0;
int Fib(int n)
{
    if(n==3)//测试第三个斐波那契数的计算次数
    {
        count++;
    }
    if(n<=2)
        return 1;
    else
        return Fib(n-1)+Fib(n-2);
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d",&n);
    ret = Fib(n);
    printf("ret = %d\n",ret);
    printf("count = %d\n",count);
    return 0;
}

  方法二:

#include <stdio.h>
#include <string.h>
//斐波那契数
//1 1 2 3 5 8 13 21 34 55 ......

int Fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;

    while(n>2)
    {
        c=a+b;
        a=b;
        b=c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d",&n);
    ret = Fib(n);
    printf("ret = %d\n",ret);
//    printf("count = %d\n",count);
    return 0;
}

C、汉诺塔问题

#include <stdio.h>
#pragma warning(disable:4996)
void hanoi(int n, char A, char B, char C)
{
	//只有一个圆环时直接移动
	if (n == 1)
	{
		printf("%c-->%c\n", A, C);
	}
	else {
		hanoi(n - 1, A, C, B);//A上的n-1个圆环借助C移动到B上
		printf("%c-->%c\n", A, C);//打印移动过程
		hanoi(n - 1, B, A, C);//B上的n-1个圆环借助A移动到C上
	}
}
int main()
{

	int n = 0;
	printf("请输入圆环的个数:");
	scanf("%d", &n);
	hanoi(n, 'A',' B',' C');
	return 0;
}

D、青蚌跳台阶问题 :一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。

分析:当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;
在这里插入图片描述

#include <stdio.h>

int flog(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else
		return flog(n - 1) + flog(n - 2);
}
int  main()
{
	int n = 0;
    int ways = 0;
	printf("请输入台阶的数量:");
	scanf("%d", &n);
	ways = flog(n);
	printf("青蛙有%d种跳法",ways);
	return 0;
}

8、备注:

  1. 本文章是个人总结,如有错误请指正;
  2. 部分资料来源于网络和开发手册,如有侵权请联系我删除;
  3. 如需上方资料,请与我联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y黎好好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值