分支与循环语句的练习
1.计算 n的阶乘
int main() { int i = 0; int n = 0;//计算n的阶层 printf("请输入一个数:\n"); scanf("%d",&n); int ret = 1; for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d的阶层是:%d\n", n, ret); return 0; }
2.计算1!+2!+3!+……+10!
int main() { int i = 0; int sum = 0; int ret = 1; int n = 0; scanf("%d", &n); for (i = 1; i <=n; i++) { ret = ret * i; sum = sum + ret; } printf("%d\n", sum); return 0; }
3. 在一个有序数组中查找具体的某个数字n(二分查找算法)
int main() { int k = 5;//记录要查找的数字 int arr[] = { 1,2,3,4,5,6,7,8}; int size = sizeof(arr) / sizeof(arr[0]);//计算数组的大小 int left = 0; int right = size - 1; int flag = 0; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] == k) { printf("找到了!下标是:%d\n", mid); flag = 1; break; } if (arr[mid] > k) { right = mid - 1; } if (arr[mid] < k) { left = mid + 1; } } if (flag == 0) { printf("没有找到!\n"); } return 0; }
图解:
- 我们使用mid记录中间数的下标,此时的mid为(0+7)/2 = 3,该mid下标对应的元素是4,4比我们要查找的5要小,因为该数组是有序的,所以此时mid下标左边的数都一定会比5要小,所以我们的搜索范围就成了mid的右边的元素,所以这时右下标不用变动,左下标改成mid+1
- 此时的mid就变成了5,该mid下标对应的元素是6,比我们要查找的5要大,所以此时mid的右边的元素都比5要大,搜索范围再一次缩小,left不变,因为mid下标对应的元素也比我们的要查找的数大,所以有下标从mid的左边开始,right变成mid-1。
- 第三次查找时,mid变成了4,而此时的left和right相等。此时将flag设置为1,打印mid(即返回目标值的下标)。退出循环
4. 演示多个字符从两端移动,向中间汇聚。
int main() { char arr1[] = "####################"; char arr2[] = "wecome to university"; int left = 0; int right = strlen(arr1)-1; while (left <= right) { arr1[left] = arr2[left]; arr1[right] = arr2[right]; printf("%s\n", arr1); Sleep(500);//休息0.5s system("cls"); //清理屏幕 引头文件<windows.h> left++; right--; } printf("%s\n", arr1); return 0; }
5. 猜数字游戏
void game() { int ret = rand() % 100 + 1; int guess = 0; while (1) { printf("你猜的数字是:>\n"); scanf("%d", &guess); if (guess > ret) printf("猜大了!\n"); if (guess < ret) printf("猜小了!\n"); if (guess == ret) { printf("恭喜你猜对了!\n"); Sleep(1000);//需要windows.h头文件 break; } } } void menu() { printf("1:play\n"); printf("0:exit\n"); } int main()//猜数字游戏 { srand((unsigned int)time(NULL));//以时间戳生成随机数种子 int input = 0; do { system("cls");//每次开始猜的时候清空屏幕,需要stdlib.h头文件 menu(); printf("please select:>\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出成功!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } while (input); return 0; }
6. 关机程序
int main()//关机程序 { char input[20] = { 0 }; system("shutdown -s -t 60");//需要<stdlib.h>头文件 printf("您的电脑将会在60秒之后关机,请输入密码:>\n密码是:我是猪\n"); while (1) { scanf("%s", input); if (strcmp("我是猪", input) == 0)//需要<string.h>头文件 { system("shutdown -a");//解除关机 printf("恭喜你输入正确!\n"); break; } else { printf("请重新输入:>\n"); } } return 0; }
7. 打印100-200的素数
int main()//寻找100-200的素数 { int i = 0; int j = 0; int count = 0; for (i = 101; i <= 200; i+=2)//100-200的偶数不可能是素数 { int flag = 1;//这条语句一定要写在for循环内部 for (j = 2; j <= sqrt(i); j++)//这里直接<=sqrt 筛掉很多数据 要包含<math.h> { if (i % j == 0) { flag = 0; break; } } if (flag == 1) { printf("%d\n", i); count++; } } printf("共有%d个素数!\n",count); return 0; }
8. 求两个数的最大公约数(辗转相除法)
int main() { int a = 0; int b = 0; int k = 0; printf("please input two number:>\n"); scanf("%d %d", &a, &b); while (k = a%b)//a { a = b; b = k; } printf("%d\n", b); return 0; }
9.打印闰年
闰年:
- 能被4整除但不能被100整除。
- 能被400整除。
#include <stdio.h> int main() { int year = 0; for(year=1000; year<=2000; year++) { //判断year是否为闰年 if(year%4==0) // 如果year能够被4整除,year可能为闰年 { if(year%100!=0) // 如果year不能内100整除,则一定是闰年 { printf("%d ", year); } } if(year%400 == 0) // 每400年再润一次 { printf("%d ", year); } } return 0; }