当前位置 博文首页 > HyDraZya的博客:【C语言基础】练习题

    HyDraZya的博客:【C语言基础】练习题

    作者:[db:作者] 时间:2021-09-05 09:45

    练习1

    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);
        //32以上的数字会溢出
        return 0;
    }

    2.计算1!+2!+3!+……+10!:

    #include <stdio.h>
    int main()
    {
        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;
    }
    //sum = 4037913

    ?3.在一个有序数组中查找具体的某个数字n,并打印出其下标

    方法1:

    #include <stdio.h>
    int main()
    {
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        int k = 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;
    }

    ??方法2(二分/折半查找算法):

    #include <stdio.h>
    int main()
    {
       int arr[] = {1,2,3,4,5,6,7,8,9,10};
       int k = 7;
       int left = 0;//左下标
       int sz = sizeof(arr)/sizeof(arr[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;
    }

    注:

    • 下标都是从0开始延续的,不管数组是否是乱码还是有序,下标有都会呈0,1,2,3,4,5……这种形式
    • 乱序时可以用代码将它从小到大排列然后再去找,这样子虽然不能找到最初的下标,但是能够查询到这个元素是否在里面
    • 二分查找算法可应用于有序数列,乱序数列可以编排成序再进行二分

    4.编写代码,演示多个字符从两端移动,向中间汇聚。

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

    练习2

    1.写一个代码将三个数按从大到小输出:

    #include <stdio.h>
    int main()
    {
        int a = 0;
        int b = 0;
        int c = 0;
        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;
    }

    2.写一个代码打印1-100之间的所有3的倍数的数字:

    #include <stdio.h>
    int main()
    {
        int i = 0;
        for(i=1; i<=100; i++)
        {
            if(i%3 == 0) //%——取模
                printf("%d ", i);
        }
        getchar();
        return 0;
    }

    3.给定两个数,求这两个数的最大公约数:

    当m<n时模就是m,相当于m除以n得0余m,然后在数值上换位,仍是m>n

    #include <stdio.h>
    int main()
    {
        int m = 0;
        int n = 0;
        int r = 0;
        scanf("%d %d", &m, &n);
        while(m%n)
        {
            r = m%n;
            m = n;
            n = r;
        }
        //辗转相除法
        printf("%d\n", n);
        getchar();
        getchar();
        return 0; 
    }

    4. 打印1000到2000年之间的闰年:

    方法1:

    #include <stdio.h>
    int main()
    {
        int year = 0;
        int count = 0;
        for(year = 1000; year<=2000; year++)
        {
            //判断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;
    }

    方法2:

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

    5.打印100~200之内的素数:

    (1)试除法:

    #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("\ncount = %d\n", count);
        return 0;
    }

    (2)将所有素数视为奇数:

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

    (3)除了2以外,所有可能的质因数都是奇数,先尝试2,再尝试从3开始知道x/2的所有奇数:

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

    (4)使用sqrt函数:

    ?i=a*b

    a和b中至少有一个数字<=开平方i

    #include <stdio.h>
    #include <math.h>//调用sqrt函数
    int main()
    {
        int i = 0;
        int count = 0;
        //sqrt - 开平方的数学库函数
        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("\ncount = %d\n", count);
        return 0;
    }

    (5)筛选法:?

    只要尝试小于sqrt(x)的素数即可,而这些素数,在前面已经算出,将已经算出的素数,先保存起来,然后用于后续的试除。

    步骤:
    1.先将1去除(1不是素数)
    2.用2除它后面的各个数,把能被2整除的数去除,即把2的倍数去除掉
    3.用3除后面的各个数,把能被3整除的数去除,即把3的倍数去除掉
    4.分别用5…作为除数除这些数后面的数
    这些操作需要一个很大的容器去装载所有数的集合,只要满足这些步骤,即将大于1的且是2、3、4…的倍数全部置为0,一直到数据集合的末尾,最终不是0的数就是素数。

    #include <stdio.h>
    int main()
    {
    	int i = 9;
    	int j = 0;
       int arr[100];
    	int count = 0;
    	for(i=0; i<100; i++)
    	{
    		arr[i] = i + 1;
       }
       for(i = 0; i < 100; i++)
    	{
          j = i - 1;//通过0、1、2
          while(j > 1)
          {
             if(arr[i] % j == 0)
                arr[i] = 0;
                j = j - 1;
          }
    	}
       for(j = 1; j < 100; ++j)
       {
          if (arr[j] != 0)
          {
    			printf("%d ", arr[j]);
             count++;
          }
       }
    	printf("\ncount = %d\n", count);
    	return 0;
    }

    练习3?

    1.编写程序数一下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;
    }

    2.计算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);
        getchar();
        return 0;
    }

    3.求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;
    }

    4.在屏幕上输出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=%d\t", i, j, i*j);
            }
            printf("\n");
        }
        return 0;
    }

    猜数字游戏:

    1.电脑生成一个随机数

    2.猜数字

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    void menu()
    {
       printf("****************************\n");
       printf("****   1.play  0.exit   ****\n");
       printf("****************************\n");
    }
    //1为玩游戏(真),0为退出(假)
    //RAND_MAX-32767
    void game()
    {  
       //1.生成一个随机数
       int ret = 0;
       int guess = 0;
       //拿时间戳来设置随机数的生成起始点
       //time_t_time(time_t * timer)
       //time_t
       ret = rand()%100+1;//生成1-100的随机数
       //2.猜数字
       while(1)
       {
          printf("请猜数字:>");
          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;
    }

    关机程序:?

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

    cs