分支与循环习题课(上课笔记)

练习题目

1.计算n的阶乘。

#include<stdio.h>
int main()
{   
    int i = 0;
    int n = 0;
    int ret = 1;
    scanf("%d", &n);
    for( i = 1; i <= n; i++)
    {
        ret = ret * i;
        
    }
    printf("ret = %d\n",ret);
    return 0;
}

2.计算1!+2!+......+10!。

#include<stdio.h>
int main()
{
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
    for(n = 1; n <= 10; n++)//将n从1循环到10
    {
        for(i = 1; i <= n; i++)//求n的阶乘
        {
            ret = ret * i;
        }
        
        sum = sum + ret;
        ret = 1; //对ret进行初始化,否则将一直累加
    }
    printf("%d\n",sum);
    return 0;
}

3.在一个有序数组中查找某个具体数字n。

编写int binserch(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]); //python中的len()函数的数组型替代
    for(i = 0; i < sz; i++)
    {
        if(k == arr[i])
        {
            printf("找到了下标是:%d\n", i);
            break;
        }
    }
    if (i == sz)
    {
        printf("找不到");
    }
    return 0;
}

#此写法为遍历写法,最坏的情况是查找n次。

写法二:

既然是有序数组,那么可以找中间数比较大小,比中间数大的在右边,比中间数小的在左边,这种算法叫折半查找算法(二分查找算法),效率是更高的。

1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9

先求中间数:下标平均值:(9+0)/ 2 = 4 ...... 1, 取4

5的下标为4 ,5 < 7, 查找右边区间,以此类推,最多算4次,此时算法复杂度为ln2/ln10

即log2(n),当n的次数逐渐增大时,第二种算法的优越性就凸显出来了

eg: n = 2^32时

写法一:2^32次

写法二:32次

#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 left = 0;
    int right = sz - 1; //右下标
    
    int k = 7; //寻找对象
    while(left <= right)
    {
        int mid = (left + right) / 2;//对mid的一个更新过程。
        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;
}

ps:1.对while循环条件的判断:找一组数字推到最后看看找不到会发生什么样的结果。

       2.逻辑是找到了就停止了,不关心有几个的问题。

4.编写代码,演示多个字符向两端汇聚。

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
    //	有两串字符:
    // 1234567890qwertyuiopasdfghjkl
    // #############################
    //写法:将第一行字符的两端依次替换掉两边的#
    char arr1[] = "1234567890qwertyuiopasdfghjkl";
    //元素个数不给定,初始化以后方字符串的大小为准
    char arr2[] = "#############################";
    int left = 0;
    int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
    //为什么是减二呢?
    // 字符串的存放方式是[0 1 2 3 ...... l \0]
    // \0这个东西会包含进arr1的大小中,会影响right的结果,若是减一的话,选中的就是 \0 了
    //或者
    // int right = strlen(arr1) - 1;
    //库文件是string.h
    //一种只计算字符串长度的函数//
    while(left <= right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        //休息一秒
        Sleep(1000);//单位是毫秒
        
        //库文件是windows.h
        system("cls");//执行系统命令的一个函数---cls---清空屏幕
        //库文件是stdlib.h
        left++;
        right--;
    }
    return 0;
    
}

5.编写代码实现,模拟用户登陆情景,并且只能登录三次。

(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均错误,则退出程序)

#include<stdio.h>
#include<string.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() == 0/1
        //头文件是string.h
        {
        printf("登录成功\n");
        break;
    }
        else 
        {
            printf("密码错误");
        }
    }
        if (i == 3)
        {
        printf("三次密码均错误,退出程序\n");
    }
        return 0;
    }

6.输出1000-2000年之间的闰年和闰年的数量。

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

7.输出100-200之间的素数以及素数的个数。

//输出从100到200之间的素数
#include	<stdio.h>
int main()
{
    //素数判断
    //试除法
    int i = 0;
    int count = 0;
    for (i = 100; i <= 200; i++)
    {
        int j = 0;
        for(j = 2; j <= i-1; j++)
        {
            if(i % j == 0 )
            {
                break;
            }
        }
        if( j == i)
        {
            printf("%d\n", i);
            count++;
            
        }
    }
    printf("count = %d",count);
    return 0;
}
//输出从100到200之间的素数
#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))//i 的每个因子都不会大于根号i
        {
            printf("%d\n", i);
            count++;
            
        }
    }
    printf("count = %d",count);
    return 0;
}

8.

//统计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;
}

9.求10个整数的最大值。

//求10个整数的最大值
#include<stdio.h>
int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int max = arr[0];//max初始化不能是零,因为0比任何负数都大。
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for(i = 0; i < sz; i++)
    {
        if(arr[i] > max)
            max = arr[i];
        
    }
    printf("max = %d\n",max);
    return 0;
    
}

10.输出九九乘法表。

//输出乘法口诀表
//1*1=1
//2*1=2 2*2=4
//......
#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);
        }//%2d表示占两位,右对齐
        //%-2表示占两位,左对齐
        printf("\n");
    }
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值