#define _CRT_SECURE_NO_WARNINGS 1

//练习
//1.计算n的阶乘。
//#include<stdio.h>
//
//int main()
//{
//	//输入一个计算该阶乘的数
//	int i = 0;
//	int sum = 1;//sum用于统计阶乘结果
//	printf("请输入一个数:>");
//	scanf("%d", &i);
//	for (int j = 1; j < i + 1; j++)
//	{
//		sum *= j;
//	}
//	printf("%d的阶乘为:%d\n", i, sum);
//
//	return 0;
//}
////2.计算1! + 2! + 3! + ...… + 10!
//#include<stdio.h>
//
//int main()
//{
//	//输入一个计算该阶乘的数
//	int i = 0;
//	int result = 0;//result用于统计每个阶乘和的结果
//	printf("请输入一个数:>");
//	scanf("%d", &i);
//	for (int j = 1; j < i + 1; j++)
//	{
//		int sum = 1;//sum用于统计每个阶乘的结果
//		for (int k = 1; k < j+1; k++)
//		{
//			sum *= k;
//		}
//		result += sum;
//	}
//	printf("%d的阶乘和为:%d\n", i, result);
//
//	return 0;
//}

//优化:
//2.计算1! + 2! + 3! + ...… + 10!
#include<stdio.h>

int main()
{
	
	while (1)
	{
		//输入一个计算该阶乘的数
		int i = 0;
		int sum = 1;
		int f = 0;
		int result = 0;//result用于统计每个阶乘和的结果
		printf("请输入一个数:>");
		scanf("%d", &i);
		for (int j = 1; j < i + 1; j++)
		{
			sum = sum * j;
			result += sum;
		}
		printf("%d的阶乘和为:%d\n", i, result);
		printf("是否结束求解(Y/N):>");
		scanf("%d", &i);
		scanf("%c", &f);
		if ('Y' == f)
		{
			printf("循环结束\n");
			break;
		}
	}
	
	return 0;
}
//3.在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[O]
//<= V[1] <= V[2] <= ... <= v[n - 1]的数组中查找x.
#include<stdio.h>
int main()
{
	int binseatch[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	printf("该数组中的数有:");
	for (int j = 0; j < sizeof(binseatch) / sizeof(binseatch[0]); j++)
	{
		printf("%d\t", binseatch[j]);
	}

	printf("\n请输入要查找的数:>");
	scanf("%d", &i);
	int result = 0;
	for (int j = 0; j < sizeof(binseatch) / sizeof(binseatch[0]); j++)
	{
		if (i == binseatch[j])
		{
			printf("该元素的位置是%d\t", j);
			result++;
		}
	}
	if (result == 0)
	{
		printf("该数组没有该元素!");
	}

	return 0;
}
//优化
//二分查找
int main()
{
	//定义一个要查找的数组
	int arr[10] = { 1,2,3,4,5,6,7,8,9 };
	//定义一个要查找的数
	int x = 66;
	//定义数组的左下标
	int left = 0;
	//定义数组的右下标
	int right = sizeof(arr) / sizeof(arr[0])-1;
	while (left <= right)
	{
		if (x == arr[(left + right) / 2])
		{
			printf("该数的下标为:%d\n", (left + right) / 2);
			break;
		}
		else if(x > arr[(left + right) / 2])
		{
			left = (left + right) / 2 + 1;
		}
		else
		{
			right = (left + right) / 2 - 1;
		}
	}
	if (left > right)
	{
		printf("没找到\n");
	}

	return 0;
}

//4.编写代码,演示多个字符从两端移动,向中间汇聚。
//5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。