📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。
c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。
本章用循环去写一些题目。
让我们开启c语言学习之旅吧!
1.计算n的阶乘
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int i = 0; //用来控制循环 int sum =1; //存放乘积 for (i = 1; i <= n; i++) //产生1到n的数字 { sum = sum * i; //进行累乘 } printf("%d", sum); return 0; }
注意:在这里不考虑数据溢出的情况
2.计算1!+2!+3!+.......+10!
#include <stdio.h> int main() { int i = 0; int ret = 1; int sum = 0; for (i = 1; i <= 10; i++) { ret = ret * i; //在前一个数的阶乘基础上再乘这个数就是这个数的阶乘 sum = sum + ret; //进行累加 } printf("%d", sum); return 0; }
3.二分查找
我第一次见到这个二分查找的时候觉得特别难,但是把逻辑梳理清楚好像也就那么回事。
二分查找的基本思想:
二分查找,也叫折半查找,其实二分查找的思想非常简单,二分查找针对的是一个有序的数据集合,每次都会和区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。
具体执行步骤:
第一步:确定左下标,右下标,中间元素下标
第二步:用要查找的值和中间元素进行对比(通常会有3种情况)
1: 相等,找到,打印下标,跳出循环
2: key < arr[mid], 则right-1,继续到左半侧进行二分查找
3: key > arr[mid], 则left+1,继续到右半侧进行二分查找
如果找到返回下标,否则继续,直到区间中没有元素时,说明key不在集合中,打印找不到
以上是一个循环的过程,而结束循环的条件就是left<=right,或者找到了跳出循环。
代码如下:
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int key = 0; scanf("%d", &key); int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1; // right位置的数据可以取到 while (left <= right) // right位置有数据,必须要添加=号 { int mid = left + (right - left) / 2; if (arr[mid] > key) // key小于中间位置数据,说明key可能在左半侧,需要改变右边界 { right = mid - 1; // right位置的数据可以取到,因此right=mid-1 } else if (arr[mid] < key)// key大于中间位置数据,说明key可能在右半侧,需要改变左边界 { left = mid + 1; // left位置的数据可以取到,因此left=mid+1 } else { printf("找到了,下标是:%d\n", mid); break; } } if (left > right) printf("找不到\n"); return 0; }
3.打印九九乘法表。
解题思路:
两个循环进行控制
外层循环控制打印多少行
内部循环控制每行打印多少个表达式以及表达式内容。
#include <stdio.h> int main() { int i = 0; //控制行数 for(i=1; i<=9; i++) { //打印每一行内容,每行有i个表达式 int j = 0; for(j=1; j<=i; j++) { printf("%d*%d=%2d ", i, j, i*j); } printf("\n"); } return 0; }
4.求十个数中的最大值
解题思路:
创建一个数组在里面输入十个元素,定义一个元素为max。
然后利用循环往后获取元素,每获取到一个元素都会和max去比较,如果比max大这个数就是max。当循环结束之后max中的元素就是max。
#include <stdio.h> int main() { int arr[10] = {0}; int i = 0; int max = 0; for(i=0; i<10; i++) { scanf("%d", &arr[i]); } max = arr[0]; for(i=1; i<10; i++) { if(arr[i]>max) max = arr[i]; } printf("max = %d\n", max); return 0; }
5.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
解题思路:
通过对题目的分析就会发现,基数项为正,偶数项为负。
利用循环1.0/i,然后用flag控制奇偶项,奇数项为正,偶数项为负
#include <stdio.h> int main() { int i = 0; double sum = 0.0; int flag = 1; for(i=1; i<=100; i++) { sum += flag*1.0/i; flag = -flag; } printf("%lf\n", sum); return 0; }
6.编写程序数一下 1到 100 的所有整数中出现多少个数字9
解题思路:
1. 给一个循环从1遍历到100,拿到每个数据后进行一下操作
2. a. 通过%的方式取当前数据的个位,检测个位数据是否为9
如果是,给计数器加1
b. 通过/的方式取当前数据的十位,检测十位数据是否是9
如果是,给计数器加1
循环一直继续,直到所有的数据检测完,所有9的个数已经统计在count计数中。
#include <stdio.h> int main() { int i = 0; int count = 0; for(i=1; i<=100; i++) { if(i%10==9) count++; if(i/10==9) count++; } printf("%d\n", count); return 0; }