分支与循环练习

发布于:2023-02-17 ⋅ 阅读:(743) ⋅ 点赞:(0)

《小题巧练》

              努力篇  ——  每天努力一点,离目标更近一点。

目录

1、阶乘

2、阶乘和

 3、二分查找

4、 排序

5、打印100~200之间的素数

6、打印1000年到2000年之间的闰年

7、1到 100 的所有整数中出现多少个数字9

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

 9、给定两个数,求这两个数的最大公约数

10、给定两个数,求这两个数的最小公倍数

11、求10 个整数中最大值 


 

1、阶乘

问题描述:

计算n的阶乘,例:n! = 1*2*3*4*5*.....*n。

输入描述:

输入一个正整数n

输出描述:

输出n的阶乘

示例:

输入:3                     输入:5

输出:6                     输出:120

代码实现:

解法1:for循环

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d",&n);
	int i = 0;
	int ret = 1;//更新每次阶乘的结果

	for (i = 1; i <= n; i++)
	{
		ret = ret * i;
	}

	printf("%d 的阶乘是:%d",n,ret);
	return 0;
}

 解法2:while循环

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d",&n);
	int i = 1;
	int ret = 1;
	while (i <= n)
	{
		ret = ret * i;
		i++;
	}
	printf("%d 的阶乘是:%d",n,ret);
	return 0;
}

 结果:

 结果:

2、阶乘和

问题描述:

计算 n!的阶乘和,例:1!+ 2!+ 3!+ …… + n!  

输入描述:

输入一个正整数n

输出描述:

输出1!+2!+3!+......+n!的和

示例:

输入:3                     输入:5

输出:9                     输出:153

代码实现:

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

	printf("%d",sum);
	return 0;
}

结果:

 3、二分查找

介绍:

二分查找也叫作折半查找。二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。

以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。每次比较的数列长度都会是之前数列的一半,直到找到相等元素的位置或者最终没有找到要找的元素。

问题描述:

在一个整形有序数组中查找具体的某个数。

输入描述:

输入一个正整数 。

 输入描述:

找到了就打印数字所在的下标。

找不到则输出:找不到。

示例:

在1-10的有序数组中。

输入:7                                                                输入:12

输出:找到了,下标是6                                       输出:没找到!

代码实现:

#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 = 0;
	//左右边界
	int left = 0;
	int right = sz - 1;
	scanf("%d", &k);
	while (left<=right)
	{
		 
		int mid = (right + left) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d",mid);
			break;
		}
	}
	if (left > right)
	{
		printf("没找到!");
	}
	return 0;
}

结果:

注意:

int sz = sizeof(arr) / sizeof(arr[0]);

这段代码是计算数组中的元素个数,sizeof(arr)计算的是整个数组的大小,单位是字节,sizeof(arr[0])计算的数组首元素的大小,代表单个元素的大小,单位也是字节。 

测试:

#incldue <stdio.h>
int main()
{
	int arr[10] = {0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d",sz);
	return 0;
}

结果:


int left = 0;
int right = sz - 1;

left 和 right是有序数组的左右边界min和max的下标。在这个范围进行二分查找。


int mid = (right + left) / 2;

mid 表述左右边界的中间值,和要查找的值k进行比较。

当mid>k时,更新右边界,mid-1;

mid<k时,更新左边界,mid+1;

4、 排序

问题描述:

将输入的三个整数按从大到小的顺序输出。

输入描述:

输入三个正整数

输出描述:

按从大到小的顺序输出。

示例:

输入:8  24  7                                   输入:30 22 40

输出:24 8 7                                     输出:40 30 22

代码实现:

#include <stdio.h>
int main()
{
	int a, b, c;
	int temp = 0;
	scanf("%d %d %d",&a,&b,&c);
	if (a < b)
	{
		temp = b;
		b = a;
		a = temp;
	}
	if (a < c)
	{
		temp = c;
		c = a;
		a = temp;
	}
	if (b < c)
	{
		temp = c;
		c = b;
		b = temp;
	}
	printf("%d %d %d",a,b,c);
	return 0;
}

结果:

  

5、打印100~200之间的素数

什么是素数:

素数又叫质数,定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

输入描述:

输出描述:

1-100间的所有素数

代码实现:

#include <stdio.h>
int main()
{
	 int i = 0;
	 //取100-200
	 for (i = 100; i <= 200; i++)
	 {
		 int j = 0;
		 for (j = 2; j < i; j++)
		 {
			 if (i % j == 0)
			 {
				 break;
			 }
		 }
		 //是素数, 上述循环结束之后,如果j和i相等,说明[2, i)之间的所有数据都不能被i整除,则i为素数
		 if (j == i)
		 {
			 printf("%d ", i);
		 }
		
	 }
	 return 0;
}

 结果:

6、打印1000年到2000年之间的闰年

什么是闰年:

如果N能够被4整除,并且不能被100整除,则是闰年,或者N能被400整除,也是闰年。
即:4年一润并且百年不润,每400年再润一次

代码实现:

#include <stdio.h>
int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if ((year % 4 == 0) && (year % 100 != 0) || (year % 100 == 0))
		{
			printf("%d ",year);
		}
	}
	return 0;
}

 结果:

7、1到 100 的所有整数中出现多少个数字9

代码实现:

#include <stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9 || i / 10 == 9)
		{
			printf("%d ",i);
			count++;
		}
		
	}
	printf("\n一共有%d个9:", count);
	return 0;
}

结果:

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

代码实现:

#include <stdio.h>
int main()
{
	float sum1 = 0.0;
	float sum2 = 0.0;
	float sum = 0.0;
	int i = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 0)
		{
			sum1 += 1.0 / i;
		}
		else
		{
			sum2 = sum2 += 1.0 / i;
		}
	}
	sum = sum2 - sum1;
	printf("%f ",sum);
	return 0;
}

结果:

 9、给定两个数,求这两个数的最大公约数

什么是最大公约数:

最大公约数又叫最大公因数,是指两个或多个整数共有约(因)数中最大的一个。

示例:

输入:50 100

输出:50 

代码实现:

解法1: 

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int min = (a > b ? b : a);
	while (1)
	{
		if (a % min == 0 && b % min == 0)
		{
			printf("%d",min);
			break;
		}
		min--;
	}

	return 0;
}

解法2:辗转相除法

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int r = 0;
	while (r = a%b)
	{
		a = b;
		b = r;
		
	}
	printf("%d ",b);
	return 0;
}

结果:

10、给定两个数,求这两个数的最小公倍数

什么是最小公倍数:

在两个或两个以上的自然数中,如果它们有相同的倍数, 这些倍数就是它们的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。

代码实现:

解法1:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int max = a > b ? a : b;
	while (1)
	{
		if (max % a == 0 && max % b == 0)
		{
			printf("%d", max);
			break;
		}
		max++;
	}
	return 0;
}

结果:

11、求10 个整数中最大值 

代码实现:

#incldue <stdio.h>
int main()
{
	int arr[10] = { 1,22,34,11,33,4,5,6,30,12 };
	int max = arr[0];
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ",arr[i]);
		if (max < arr[i])
		{
			max = arr[i];
		}
	}
	printf("\n数据中最大的是:%d",max);
	return 0;
}

结果:

希望大家监督,发现错误的小伙伴记得私信我哦,我会及时改正,嘻嘻嘻。

本文含有隐藏内容,请 开通VIP 后查看