【C语言基础】练习题

22 篇文章 15 订阅

练习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;
}

  • 46
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HyDraZya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值