分支和循环语句刷题记录:打印3的倍数、整数排序、打印素数(试除法)、打印闰年、最大公约数、乘法口诀表、求最大值、分数求和、猜9的个数、猜数字游戏、二分查找算法的实现

本文详细介绍了编程中常见的分支和循环语句的使用,包括if、switch、for、while等,并通过实例展示了如何打印素数、判断闰年、实现乘法口诀表、二分查找等经典算法。同时,涵盖了逻辑运算、数组操作、随机数生成等编程基础知识,适合初学者巩固和提升编程技能。
摘要由CSDN通过智能技术生成
分支和循环语句刷题记录:

1. if语句括号后执行情况

在这里插入图片描述

2. if语句

在这里插入图片描述

3. switch语句
image-20220801210945314
对A的代码演示:

在这里插入图片描述

4. switch…case语句相关例题

在这里插入图片描述

无break,从case1一口气顺利执行到default语句

switch决定程序入口,case语句决定程序出口

5. case语句(整型表达式)

在这里插入图片描述

6. switch…case语句执行示例

在这里插入图片描述

7. 打印3的倍数
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 100; i++)
	{
		//判断i是否为3的倍数
		if (i % 3 == 0)
		{
			printf("%d ", i);//%d添加空格,用空格隔开每个打印的值
		}
	}
	retrn 0;
}//循环100次

//另,效率较高
int main()
{
	int i = 0;
	for (i = 3; i <= 100; i += 3)
	{
		printf("%d ", i);
	}
	return 0;
}//循环33次
8. 写代码将三个整数数按从大到小输出
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b, &c);
	int tem = 0;
	if (a < b)
	{
		tem = a;
		a = b;
		b = tem;
	}
	if (a < c)
	{
		tem = a;
		a = c;
		c = tem;
	}
	if (b < c)
	{
		tem = b;
		b = c;
		c = tem;
	}
	printf("%d %d %d\n,a,b,c");
	return 0;
}
9. 打印素数(试除法)

素数——质数:只能被1和它本身整除
i=mn,m和n中至少有一个数字是<=开平方i的
16=2
8
16=4*4

2~开平方i-1之间的数字去试除i

可参考:《素数求解的N种境界》

int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i < 200; i++)
        // for(i=101;i<=200;i+=2)
//在奇数中寻找
	{
		int flag = 1;//表示是素数
		//判断i是否为素数
		//使用2~i-1的数字试除i
		int j = 0;
		for (j = 2; j < sqrt(i); j++)//sqrt:开平方的函数
		{
			//拿j来试除i
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (1==flag)
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\ncount=%d\n", count);
	return 0;
}
10. 打印闰年

闰年的判断规则:

1.能被4整除,不能被100整除是闰年。
2.能被400整除是闰年。

即:四年一闰,百年不闰,四百年一闰
//1.能被4整除,不能被100整除是闰年
//2.能被400整除是闰年
int main()
{
	int year = 0;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		//判断year是不是闰年
		if (year % 4== 0)
		{
			if (year % 100 != 0)
			{
				count++;
				printf("%d ", year);
			}
		}
		if(year%400==0) 
		{
			count++;
			printf("%d ", year);
		}
	}
		printf("\ncount=%d\n", count);
	return 0;
}

//运用逻辑操作符进行一些简化
int main()
{
	int year = 0;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if(((year%4==0)&&(year%100!=0))||(year%400==0))
		{
						count++;
						printf("%d ", year);
		}
	}
		printf("\ncount=%d\n", count);
	return 0;
}
11. 最大公约数
假设最大公约数k,最小公倍数=m*n/k
//法一:正常数学范围
int main()
{
	//18 12
	int m = 0;
	int n = 0;
    scanf("%d %d", &m, &n);
//求最大公约数
	int min=(m<n?m:n)while (1)
		{
			if (m % min == 0 && n % min == 0)
			{
				printf("%d\n", min);
				break;
			}
			min--;
		}
	return 0;
}

//法二:辗转相除法
//更符合代码逻辑的算法
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;
}
12. 乘法口诀表
int main()
{
	int i = 0;
	for (i = 1; i <= 9; i++)
	{
		//打印一行
		int j = 0;
		for (j=1;j<i;j++)
		{
			printf("%d*%d=%-2d ", i, j, i * j);
		}
		printf("\n";)
	}
	return 0;
}
13. 求最大值
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int max = arr[0];
	//若有负数,则不可取:int max = 0;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		if (arr[i] > max)
			max = arr[i];
	}
	printf("%d\n", max);
	return 0;
}


14. 条件表达式与循环体

在这里插入图片描述

15. for、if与break、continue综合习题

在这里插入图片描述

16. 分数求和

计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

int main()
{
	int i = 0;
	double sum = 0;
	int flag = 1;
	for (i = 1; i <= 100; i++)
	{
		sum +=(flag* 1.0 / i);
		flag = -flag;
	}
	printf("%lf\n", sum);
	return 0;
}
17. 数9的个数

编写程序数一下1到 100 的所有整数中出现多少个数字9

//个位和十位出现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)
       //不可写成else if
			count++;
	}
	printf("\ncount=%d\n", count);
	return 0;
}
18. 猜数字游戏
//电脑随机生成1~100之间的数字
//猜数字
//如果猜小了,告知猜小了;如果猜大了,告知猜大了;如果猜对了,告知猜对了
//do...while()嵌套switch
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("*********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("*********************************\n");
}
void game()
// rand函数可以生成随机数:0~RAND_MAX(0x7fff=32767)
{
	//1.生成随机数
    int ret = rand()%100+1;
	//任何数取模100得到的余数的范围肯定是0~99+1=>0~100
	//printf("%d\n", ret);
	//2.猜数字
	printf("请猜数字:>");
	while(1)
	{
		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));//强制类型转换
	//time_t本质是整型,故强制类型转换是int型
	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;
}
19. 二分查找

找到了就打印数字所在的下标,找不到则输出:找不到。

/*
二分查找:
 在一个有序的序列中,找某个数据是否在该集合中,如果在打印该数据在集合中的下标,否则打印找不到。

 具体找的方式:
  1. 找到数组的中间位置
  2. 检测中间位置的数据是否与要查找的数据key相等
    a: 相等,找到,打印下标,跳出循环
    b: key < arr[mid], 则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找
    c: key > arr[mid], 则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找
    如果找到返回下标,否则继续,直到区间中没有元素时,说明key不在集合中,打印找不到

 易错点:
 1. right的右半侧区间取值,该值决定了后序的写法
 2. while循环的条件是否有等号
 3. 求中间位置的方法,直接相加除2容易造成溢出
 4. 更改left和right的边界时,不确定是否要+1和-1
*/

// 方法一,采用[left, right] 区间
#include <stdio.h>
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int key = 3;
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0])-1; // right位置的数据可以取到
	while(left<=right) // right位置有数据,必须要添加=号
	{
		int mid = left+(right-left)/2;
		if(arr[mid]>key) // key小于中间位置数据,说明key可能在左半侧,需要改变右边界
		{
			right = mid-1; // right位置的数据可以取到,因此right=mid-1
		}
		else if(arr[mid]<key)// key大于中间位置数据,说明key可能在右半侧,需要改变左边界
		{
			left = mid+1; // left位置的数据可以取到,因此left=mid+1
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
      break;
		}
	}
	if(left>right)
	   printf("找不到\n");
	return 0;
}

// 方法二,采用[left, right) 区间
#include <stdio.h>
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int key = 3;
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0]); // right位置的数据取不到
	while(left<right) // right位置没有数据,此处不需要添加=
	{
		int mid = left+(right-left)/2;
		if(arr[mid]>key) // key小于中间位置数据,说明key可能在左半侧,需要改变右边界
		{
			right = mid; // right位置的数据取不到,因此right=mid,不需要减1
		}
		else if(arr[mid]<key)// key大于中间位置数据,说明key可能在右半侧,需要改变左边界
		{
			left = mid+1; // left位置的数据可以取到,因此left=mid+1
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
            break;
		}
	}
	if(left>=right)
		printf("找不到\n");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值