目录
-
- 计算n!的阶乘
- 计算1!+2!+3!+......+10!的和
- 计算100到200之间的素数
- 在一个有序数组中查找某个数字n。编写int binsearch(int x,int v[],int n)功能:在v[0]<=v[1]<=..<=v[n-1]的数组中查找x.
- 编写代码,演示多个字符从两端移动,向中间汇聚
- 编写代码,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如密码正确则提示登录成功,如果三次输入错误,则退出程序)
题目
1、计算n!的阶乘
代码
#include<stdio.h>
//计算n的阶乘
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
2、计算1!+2!+3!+...+10!
代码
方法一:
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret *= n;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
方法二:
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret = 1;//计算n的阶乘之前,把ret初始为1
for (i = 1; i <= n; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
3、计算100~200之间的素数
代码
#include<stdio.h>
int main()
{
for(int i=100;i<200;i++)
{
for(int j=2;j<i;j++)
{
if(i%j==0)
{
break;
}
else{
printf("%6d",i);
break;
}
return 0;
}
4、在一个有序数组中查找某个数字n。编写int binsearch(int x,int v[],int n)功能:在v[0]<=v<=v[2]...<=v[n-1]的数组中查找x.
方法:二分查找;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//要查找的数字
//在arr这个有序的数组中查找k(7)的值
int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
int left = 0;
int right = sz-1;
while (left<=right)
{
int mid = (right + left) / 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;
}
在这里要先定义一left和right两个边界变量,一开始让它们分别指向数组的第一个元素和最后一个元素。
二分查找的具体方式:
1、根据left和right找到数组的中间位置
2、检测中间位置的数据是否与要查找的数据key相等
- 相等,找到,打印下标,跳出循环
- key<arr[mid],则key可能在arr[mid]的左侧,让right=mid-1,继续到左半侧进行二分查找。
- key>arr[mid],则key可能在arr[mid]的右半侧,让left=mid+1,继续到右半侧进行二分查找。
如果找到返回下标,否则继续,直到区间中没有元素时,说明key不在集合中,打印找不到。
易错点:
- right的右半侧区间取值,该值决定了后序的写法
- while循坏的条件是否有等号
- 求中间位置的方法,直接相加除2容易造成溢出
- 更改left和right的边界时,不确定是否+1和-1,对于易错点三,在我们上面所写的代码中求mid的值int mid=(left+right)/2就可能发生,为了避免造成溢出,我们最好这样求mid的值,即int mid=left+(right-left)/2。
5、编写代码,演示多个字符从两端移动,向中间汇聚
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
//system需要一个stdlib.h的头文件
//Sleep需要一个windows.h的头文件
int main()
{
char arr1[] = "Welcom to China!!!!!";
char arr2[] = "####################";
int right = strlen(arr1) - 1;
int left = 0;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
Sleep(1000); //单位是毫秒,加上Sleep,在屏幕上打印每一行的时候会有停顿
//system("cls"); //清屏,如果加上这个清屏的话每打印一行会清屏
}
return 0;
}
这个题非常有趣建议大家可以在自己的电脑上试试。
6、编写代码,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如密码正确则提示登录成功,如果三次输入错误,则退出程序)
代码
#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字符串函数,它是用来比较字符串的。
对于该字符串函数strcmp,strcmp(str1,str2)的返回值取决于str1、str2的大小:
- 若字符串str1<str2,则返回<0的数
- 若字符串str1>str2,则返回>0的数
- 若字符串str1=str2,则返回0.
总结
以上就是我今天我所学总结的关于分支语句和循环语句使用的一些练习,它们的使用我们在以后的刷题中肯定还会常见的,希望大家都能熟悉掌握它们的使用,同时也希望我的这篇博客给大家带来收获。