求n的阶乘,以及在有序数组中折半查找一个数

11 篇文章 2 订阅

阶乘的概念

一个正整数的阶乘factorial)是所有小于及等于该数的正整数,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。

亦即n!=1×2×3×...×(n-1)×n。

方法:

int main() {

	int a = 0;//n的阶乘
	scanf("%d", &a);
	int b = 0,c = 1;//初始值

	for (b = 1; b <= a; b++) {
		c = c * b;
	}
	printf("%d", c);

	return 0;
}

b永远比a小,例如a是2,b就是1。c不能为0,0乘任何数都得0 。那么带入一下

如果求3的阶乘

a=3,b=0,c=1。

b=1,b小于a,为真,执行下一步,c=1×1,然后b++,

b=2,b小于a,为真,执行下一步,c=1×2,然后b++,

b=3,b等于a,为真,执行下一步,c=2×3,然后b++,

b=4,b大于a,为假,结束

结果就是6

求1!+2!+3!:

int main() {
	int a = 0, b = 1, c = 1, d = 0;
	while (b<=3) {
        //c = 1;
		for (a = 1; a <= b; a++) {
			c = c * a;
		}
		b++;
		d = d + c;
	}
	printf("%d", d);
	return 0;
}

折半查找:

int main() {

	char arr[] = { 1,2,3,4,5,6,7,8,9,10 };//定义的有序数组
	int key = 7;						  //需要查找的数

	return 0;
}

首先定义一个有序的数组,再定义需要查找的数

int main() {

	char arr[] = { 1,2,3,4,5,6,7,8,9,10 };//定义的有序数组
	int k = 7;						  //需要查找的数

	int left = 0;//左下标

	//	每个元素4byte			
	//			40		  /			4
	int sz = sizeof(arr) / sizeof(arr[0]);


	int right =sz-1;//右下标


	while (left<=right) {

		//一定要放到循环里,因为每一次循环都要求
		
		int mid = left + (right - left) / 2;//中间元素的下标
            

		//int mid;//这是一个值,和arr没有关系
		//arr[mid];		//这是arr中间下标的值


		//如果中间元素比要查找的元素小,那么被查找的元素就在中间元素右边
		//所以左下标就要换成中间元素加1
		// arr[mid] < k ,  如果mid =5,	那么k = 6 ~ 10;
		if (arr[mid] < k) {
			left = mid + 1;
		}
		//构成一个新的查找范围


		//如果中间元素比要查找的元素大,那么被查找的元素就在中间元素的左边
		//所以右下标就要换成中间元素减1
		//arr[mid] > k ,   如果mid = 5,  那么k = 0 ~ 4;
		else if (arr[mid] > k) {
			right = mid - 1;
		}
		//构成一个新的查找范围


		//				这种情况是相等
		//								mid就是arr,所以可以打印mid	
		else {
			printf("找到了, 下标是: %d\n", mid);
			break;
		}
	}
	if (left > right) {
		printf("找不到!\n");
	}


	return 0;
}

演示多个字符从两端移动,向中间汇聚


#include<stdlib.h>	//system的头文件
#include<windows.h>	//Sleep的头文件
#include<string.h>
int main() {

	char arr1[] = "zxcvbnmsadfhhhhhhhh";
	char arr2[] = "###################";

	int left = 0;
	int right = strlen(arr1) - 1;
	//strlen只求字符串长度,不管后面的\0
	//下标要减1

	while (left<=right) {

		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		//作用:屏幕休眠
		//首字母大写,单位是毫秒

		system("cls");
		//清空屏幕

		left++;
		right--;
	}

	printf("%s", arr2);

	return 0;
}

登录程序

#include<string.h>//stecmp的.h

int main() {

	int a = 0;
	char password[20] = { 0 };//存储密码

	for (a = 1; a <= 3; a++) {
		printf("请输入密码 !\n");

		scanf("%s",password);	//输入的密码,数组名不用取地址


					//(1) < (2) 返回小于0的数
					//(1) = (2) 返回0
					//(1) > (2) 返回大于0的数
		//比较
		if (strcmp(password, "123456") == 0) {

			printf("密码正确");
			break;
		}
		else {
			printf("密码错误,重新输入");
		}
	}

	if (a >= 3) {
		printf("退出程序");
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值