考研C语言刷题基础篇之分支循环结构基础(二)

时间:2024-01-25 17:07:50

目录

第一题分数求和

 第二题:求10 个整数中最大值

第三题:在屏幕上输出9*9乘法口诀表

第四题:写一个代码:打印100~200之间的素数 

第五题:求斐波那契数的第N个数

斐波那契数的概念:前两个数相加等于第三个数

斐波那契数的公式:

第六题:汉诺塔游戏 

思路: 

1. 当n=1时,需要一步

2.当n=2时,需要三步 

3.当n=3时,需要七步

总结一下

公式结论

 第七题:青蛙跳台阶问题

 第八题数9的个数

第十题 猜数字游戏(复习版本)

第十一题 二分查找(复习版)


第一题分数求和

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

  1. 将这个试子分成两部分,第一部分为1/1+1/3+1/5+....+1/99;第二部分1/2+1/4+.....1/100
  2. 然后将这两个试子相减
  3. 注意这里分数是浮点型
  4. double型是长整型浮点型
//分数求和

int main() {
	double sum = 0.0;
	double sub = 0.0;
	double acc = 0.0;
	for (int i = 1; i <= 100; i++) {
		if (i % 2 == 0) {
			sum += (1.0 / i);
		}
		else {
			sub += (1.0 / i);
		}
	}
	acc = sub - sum;
	printf("%lf", acc);
	

 第二题:求10 个整数中最大值

 

//求10 个整数中最大值

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	/*scanf("%d ", arr);*/
	int i = 0;
	int j = 0;
	for(int i = 0;i<10;i++)
	{
		if (arr[i] >arr[i + 1])
		{
			j = arr[i];
		}
		else
		{
			j = arr[i+1];
		}
	}
	printf("%d", j);
	return 0;
}

第三题:在屏幕上输出9*9乘法口诀表

 两层循环第一层循环用来控制乘号左边,第二层循环用来控制乘号右边和每一层的个数

//在屏幕上输出9*9乘法口诀表

int main() 
{
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=i;j++)
		{
			printf("%d*%d=%d ", j, i, j*i);
		}
		printf("\n");
	}
	return 0;
}

第四题:写一个代码:打印100~200之间的素数 

第五题:求斐波那契数的第N个数

斐波那契数的概念:前两个数相加等于第三个数

1    1   2   3   5   8    13   21   34   55  

斐波那契数的公式:

当N<=2时   Fib(N)= 1;

当N>3时, Fib(N)=Fib(N-2)+Fib(N-1);2

//求斐波那契数列的第N个数

int Fib(int n) {

	if (n <= 2) {
		return 1;
	}
	else {
		return Fib(n - 1) + Fib(n - 2);
	}

}

int main() {

	int n = 0;
	scanf("%d", &n);
	int sum = Fib(n);
	printf("第%d个数为:%d\n", n,sum);
	return 0;


}

第六题:汉诺塔游戏 

思路: 

1. 当n=1时,需要一步

2.当n=2时,需要三步 

3.当n=3时,需要七步

 这里我们发现为了实现第四步,是完成了n=2的所有步骤3步。若将黑红当一个整体。

 那么我们要实现最后一步是不是也是完成相同的操作即n=2时的操作。

总结一下

首先,是完成一次n=2时的操作 即(n-1)时操作的操作。

在加上一步将蓝色放入第三根柱子的操作

最后,是将黑红当一个整体,在完成一次n=2即(n-1)时的操作。

公式结论

汉诺塔公式为:

当n=1时    要1步

当n>1时    要 2*(n-1)+1步

//汉诺塔游戏
int Hanoi(int n) {

	if (n == 1) {
		return 1;
	}
	else {
		return 1 + 2 * Hanoi(n - 1);
	}

}

int main() {

	int n = 0;
	scanf("%d", &n);
	int sum = Hanoi(n);
	printf("需要%d步", sum);
	return 0;

}

 第七题:青蛙跳台阶问题

 问题:青蛙一次可以跳一个台阶,也可以一次跳2个台阶。请问如果有n个台阶时,青蛙有几种方法

台阶数 第一次跳一格 第一次跳两格 方法数
1 1 1
2 1 1 2 2
3 111;12 21 3
4 1111;121;112 22;211 5
5 11111;1211;1121;1112;122 2111;221;212; 8
n n-1 n-2 (n-1)+(n-2)
//青蛙跳台游戏
int fac(int n) {

	if (n == 1) {
		return 1;
	}
	else if(n==2) {
	
		return 2;
	}else{
		return fac(n-1)+fac(n-2);
	}

}

int main() {

	int n = 0;
	scanf("%d", &n);
	int sum = fac(n);
	printf("需要%d步", sum);
	return 0;

}

 第八题数9的个数

数100以内的出现过9的数字

//数9的个数
int main() {
	int n = 1;
	while (n <= 100) 
	{
		if (n % 10 == 9) {
			printf("%d ", n);
		}
		else if(n / 10 == 9) {
			printf("%d ", n);
		}
		n++;
	}
	return 0;
}

第十题 猜数字游戏(复习版本)

 易错点:

1. srand((unsigned int)time(NULL));随机数种子,不能放在while循环里,要不然每次输入数字,都会生成随机的种子,会导致永远猜不对数字。

2.scanf("%d", &n);要放在循环里,要不然每次上一次猜对的数会一直在循环里循环。

//猜数字游戏
void menu() {

	printf("*******************\n");
	printf("*******0 结束******\n");
	printf("*******1 开始******\n");
	printf("*******************\n");
	printf("输入0/1\n");
}

int fac(int n) {
	srand((unsigned int)time(NULL));
	int nnn = rand()%100+1;
	return nnn;

}

int main() {
	menu();
	int n = 0;
	int nn = 0;
	scanf("%d", &nn);
	srand((unsigned int)time(NULL));
		if (nn == 1) {
			int sum = fac(n);
			while (1) {
				
				printf("输入你猜的数字:");
				scanf("%d", &n);
				
				if (n < sum) 
				{
					printf("猜小了\n");
					
					
				}
				else if (n > sum) 
				{
					printf("猜大了\n");
					

				}
				else 
				{
					printf("猜对了");
					break;
					
				}
			
			}
		}
		else {
			printf("结束游戏");
		}
	

	return 0;


}

第十一题 二分查找(复习版)

编写代码在一个整形有序数组中查找具体的某个数

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

//二分查找
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sum = sizeof(arr) / sizeof(arr[0]);
	printf("数组有%d个\n", sum);
	int left = 0;
	int right = sum - 1;
	int n = 0;
	printf("请输入你要查找的数:");
	scanf("%d", &n);
	while (n)
	{
		int mid = (left + (right - left)) / 2;
		if (n < arr[mid])
		{
			right = mid - 1;
		}
		else if (n > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了下标为:%d", arr[n]);
			break;
		}
	}
	return 0;
}