1.计算n的阶乘(1*2*3...*n)
//n的阶乘
#include <stdio.h>
//!n -- 1->n
int main()
{
int a = 0;
int b = 0;
int c = 1;
scanf("%d", &b);
for (a = 1; a <= b; a++)
{
c *= a;
}
printf("%d", c);
return 0;
}
- c*=a是c=c*a
- 阶乘用n!表示
- int c由1开始
2.计算1!+2+3+....+10!
//计算1!+2+3+....+10!
#include <stdio.h>
//!n -- 1->n
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
//!1+!2+!3 = 1+2+6 = 9
for (n = 1; n <= 3; n++)
{
ret = 1;//计算n的乘阶之前,把ret初始为1
for (i = 1; i <= n; i++)
{
ret *= i;
}
sum = sum + ret;
}
printf("%d\n", sum);
return 0;
}
误区:如果遗漏ret = 1;
还有另一种方法,更高效,只需要一种循环。
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (i = 1; i <= 3; i++)
{
ret *= i;
sum += ret;
}
printf("%d", sum);
return 0;
}
// 1!+2!+3!=1+2+6 =9
// 3!=3*2*1=3*2!
// 2!=2*1
3.在一个有序数组中查找具体的某个数字n。
比如我买了一双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让 你猜,你会怎么猜? 答案:你每次猜中间数。
折半查找(二分查找)
//在一个有序的数组中查找n
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n",mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
4.演示多个字符从两端移动,向中间汇聚。
参考代码:
//代码1
//编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;
printf("%s\n", arr2);
//while循环实现
while(left<=right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
//for循环实现
for (left=0, right=strlen(src)-1;
left <= right;
left++, right--)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf( "%s\n", target);
}
retutn 0;
}
增加显示时间和屏幕清空可以让程序闪烁
#include <string.h>
#include <windows.h>
#include <stdio.h>
int main()
{
char arr1[] = "zxx is sb!!!";
char arr2[] = "############";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //睡眠一秒
system("cls"); //清空屏幕
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
- 需要调用windows.h和string.h函数
- Sleep表示停留1000毫秒
- system("cls");清空屏幕,在循环内所以重复清空
- 从两边向中间运行
5.编写代码,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均错误,则退出程序。)
//编写代码,模拟用户登录情景,并且只能登录三次。
//(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均错误,则退出程序。)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
//假设正确密码字符串是“123456”
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", &password);
//if (password == "123456")-err
//两个字符串比较,不能使用 == 应该使用strcmp
if (strcmp(password, "123456") == 0)
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误,请重新输入。\n");
}
}
if (i == 3)
{
printf("三次密码均错误,退出程序。\n");
}
return 0;
}
- strcmp需要用#include <stdio.h>调用函数
- strcmp比较两个字符串相等时,strcmp返回0
- 如果返回值不为0,说明字符串不相等。
- 比较的是对应位置字符的ASCII码值
a:abcdef
b:abccqqq
- d大于c 所以a>b
- scanf为什么不加地址呢,因为char password是数组,数组名本来就是地址