1.计算n的阶乘
代码如下:
int main()
{
int n = 0;
int i = 1;
int ret = 1;
printf("请输入n:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
ret = i * ret;
}
printf("%d\n", ret);
return 0;
}
例如当n=10时,输出结果如下所示:
2.计算1!+2!+....+n!
代码如下:
int main()
{
int n = 0;
int i = 1;
int ret = 1;
int sum = 0;
printf("请输入n:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
ret = i * ret;
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
当n=5时,1+2+6+24+120=153,如下所示的结果正确。
3.在一个有序数组中查找具体的某个数字n。
方法一:遍历整个数组
代码如下:
int main()
{
int arr[] = { 1,3,5,7,9,10,14,16 };
int n = 0;
printf("请输入n:");
scanf_s("%d", &n);
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0;i < sz;i++)
{
if (arr[i] == n)
{
printf("找到了,数组下标是:%d\n", i);
break;
}
}
if (i == sz)
{
printf("没有找到");
}
return 0;
}
例如当输入n=7时,代码运行结果如下:
方法2:二分法查找
二分法也称为二分查找,是一种在有序数组或有序列表中查找特定元素的算法。它的基本思想是:首先将数组(或列表)按照升序(或降序)排列,然后取数组中间位置的元素与目标元素进行比较,如果相等则返回该位置的索引,如果目标元素小于中间元素,则在数组的前半部分继续查找,如果目标元素大于中间元素,则在数组的后半部分继续查找。不断迭代这个过程,直到找到目标元素或者确定目标元素不存在为止。
代码如下:
int main()
{
int arr[] = { 1,3,5,7,9,10,14,16 };
int n = 0;
printf("请输入n:");
scanf_s("%d", &n);
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int left = 0;//定义数组初始查找最左边的元素下标大小
int right = sz - 1;//定义数组初始查找最右边的元素下标的大小
while (left <= right)
{
int mid = (left + right) / 2;//定义初始查找中间元素下标的大小
//为了防止(left + right)的值非常大,超出int表示的范围造成溢出,也可以这样表达mid
//令 mid = left + (right - left)/2
if (arr[mid] < n)
{
left = mid + 1;//重新定义查找的最左边元素下标的大小
}
else if(arr[mid]>n)
{
right = mid + 1;//重新定义查找的最右边元素下标的大小
}
else
{
printf("找到了,数组下标是:%d\n", mid);
break;
}
}
if (left > right)//当left > right说明查找结束
{
printf("没有找到");
}
return 0;
}
例如当输入n=10时,输入结果如下:
二分法的时间复杂度为 O(log n),非常高效。它通常用于在大量数据中查找某个特定的元素,比如在一个有序数组中查找指定的数值。但是它的前提是数组或列表必须是有序的,否则无法正确查找。
4.编写代码,演示多个字符从两端移动,向中间汇聚
在讲解这题前,需要先介绍一下关于字符串的一个知识点,方便解题。
在C语言中,字符串的结束标志是一个空字符('\0')。空字符是一个特殊的字符,ASCII码为0,用来表示字符串的结束。字符串在内存中被存储为字符数组,以空字符作为结束标志。
在C语言中,字符串的长度是根据空字符来确定的。当访问一个字符数组时,程序会一直读取字符直到遇到空字符为止。因此,在定义字符数组时,需要保留足够的空间来存储空字符。例如,如果定义一个包含10个字符的字符串,那么需要定义一个长度为11的字符数组,其中最后一个字符用于存储空字符。
以下是一个示例代码,演示了字符串的结束标志:
#include <stdio.h>
int main() {
char str[] = "Hello";
printf("字符串长度:%d\n", sizeof(str)); // 输出:字符串长度:6
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("字符串长度:%d\n", sizeof(str2)); // 输出:字符串长度:6
return 0;
}
在上面的示例中,字符串"Hello"和字符数组{'H', 'e', 'l', 'l', 'o', '\0'}的长度都是6字节,因为空字符也会占用一个字节的空间。
对于str2来说,如果没有‘\0’,输出就会出现以下情况:
int main() {
char str1[] = "Hello";
//printf("字符串长度:%d\n", sizeof(str1)); // 输出:字符串长度:6
printf("str1=%s\n", str1);
char str2[] = { 'H', 'e', 'l', 'l', 'o' };
//printf("字符串长度:%d\n", sizeof(str2)); // 输出:字符串长度:6
printf("str2=%s\n", str2);
return 0;
}
这是因为字符串的结束标志是一个空字符('\0'),str2会一直输出直到遇到 空字符('\0')为止。
接下来就可以编写代码求解第四题了。
#include<windows.h>
int main()
{
char arr1[] = "I can do it!";
char arr2[] = "############";
int left = 0;
int right = strlen(arr2) - 1;//也可表示为:right = sizeof(arr2) - sizeof(arr2[0])-2
//注意:strlen()函数计算字符串的大小时,并没有算上'\0',所以只要减去1即可
//而sizeof()函数计算字符串的大小时,是把'\0'一起算是了,所以要减去2
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
Sleep(1000);//延时函数,延时1000ms = 1s,需要引入头文件#include<windows.h>
left++;
right--;
}
return 0;
}
结果如下所示:
5.编写代码实现:模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序。)
代码如下:
int main()
{
int i = 0;
char password[20] = { 0 };
//假设密码是字符串:abcdef
for (i = 0;i < 3;i++)
{
printf("请输入密码:");
scanf_s("%s", password);
if (strcmp(password, "abcdef") == 0)
//注意:比较两个字符串是否相等,不能这么表示:password=="abcdef",需要引入库函数strcmp()
//当返回值为0时,表示两个字符串相等
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误,请重新输入\n");
}
}
if (i == 3)
{
printf("三次密码均输入错误。退出程序\n");
}
return 0;
}
结果如下所示: