《小题巧练》
努力篇 —— 每天努力一点,离目标更近一点。
目录
8、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
1、阶乘
问题描述:
计算n的阶乘,例:n! = 1*2*3*4*5*.....*n。
输入描述:
输入一个正整数n
输出描述:
输出n的阶乘
示例:
输入:3 输入:5
输出:6 输出:120
代码实现:
解法1:for循环
#include <stdio.h> int main() { int n = 0; scanf("%d",&n); int i = 0; int ret = 1;//更新每次阶乘的结果 for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d 的阶乘是:%d",n,ret); return 0; }
解法2:while循环
#include <stdio.h> int main() { int n = 0; scanf("%d",&n); int i = 1; int ret = 1; while (i <= n) { ret = ret * i; i++; } printf("%d 的阶乘是:%d",n,ret); return 0; }
结果:
结果:
2、阶乘和
问题描述:
计算 n!的阶乘和,例:1!+ 2!+ 3!+ …… + n!
输入描述:
输入一个正整数n
输出描述:
输出1!+2!+3!+......+n!的和
示例:
输入:3 输入:5
输出:9 输出:153
代码实现:
#include <stdio.h> int main() { int n = 0; int ret = 1; int sum = 0; int x = 0; scanf("%d",&x); for (n = 1;n <= x; n++) { ret = ret * n; sum += ret; } printf("%d",sum); return 0; }
结果:
3、二分查找
介绍:
二分查找也叫作折半查找。二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。
以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。每次比较的数列长度都会是之前数列的一半,直到找到相等元素的位置或者最终没有找到要找的元素。
问题描述:
在一个整形有序数组中查找具体的某个数。
输入描述:
输入一个正整数 。
输入描述:
找到了就打印数字所在的下标。
找不到则输出:找不到。
示例:
在1-10的有序数组中。
输入:7 输入:12
输出:找到了,下标是6 输出:没找到!
代码实现:
#include <stdio.h> int main() { //创建有序数组 int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //计算数组的长度 int sz = sizeof(arr) / sizeof(arr[0]); //要查找的数据 int k = 0; //左右边界 int left = 0; int right = sz - 1; scanf("%d", &k); while (left<=right) { int mid = (right + left) / 2; if (arr[mid] > k) { right = mid - 1; } else if (arr[mid] < k) { left = mid + 1; } else { printf("找到了,下标是%d",mid); break; } } if (left > right) { printf("没找到!"); } return 0; }
结果:
注意:
int sz = sizeof(arr) / sizeof(arr[0]);
这段代码是计算数组中的元素个数,sizeof(arr)计算的是整个数组的大小,单位是字节,sizeof(arr[0])计算的数组首元素的大小,代表单个元素的大小,单位也是字节。
测试:
#incldue <stdio.h> int main() { int arr[10] = {0}; int sz = sizeof(arr) / sizeof(arr[0]); printf("%d",sz); return 0; }
结果:
int left = 0; int right = sz - 1;
left 和 right是有序数组的左右边界min和max的下标。在这个范围进行二分查找。
int mid = (right + left) / 2;
mid 表述左右边界的中间值,和要查找的值k进行比较。
当mid>k时,更新右边界,mid-1;
mid<k时,更新左边界,mid+1;
4、 排序
问题描述:
将输入的三个整数按从大到小的顺序输出。
输入描述:
输入三个正整数
输出描述:
按从大到小的顺序输出。
示例:
输入:8 24 7 输入:30 22 40
输出:24 8 7 输出:40 30 22
代码实现:
#include <stdio.h> int main() { int a, b, c; int temp = 0; scanf("%d %d %d",&a,&b,&c); if (a < b) { temp = b; b = a; a = temp; } if (a < c) { temp = c; c = a; a = temp; } if (b < c) { temp = c; c = b; b = temp; } printf("%d %d %d",a,b,c); return 0; }
结果:
5、打印100~200之间的素数
什么是素数:
素数又叫质数,定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
输入描述:
无
输出描述:
1-100间的所有素数
代码实现:
#include <stdio.h> int main() { int i = 0; //取100-200 for (i = 100; i <= 200; i++) { int j = 0; for (j = 2; j < i; j++) { if (i % j == 0) { break; } } //是素数, 上述循环结束之后,如果j和i相等,说明[2, i)之间的所有数据都不能被i整除,则i为素数 if (j == i) { printf("%d ", i); } } return 0; }
结果:
6、打印1000年到2000年之间的闰年
什么是闰年:
如果N能够被4整除,并且不能被100整除,则是闰年,或者N能被400整除,也是闰年。
即:4年一润并且百年不润,每400年再润一次
代码实现:
#include <stdio.h> int main() { int year = 0; for (year = 1000; year <= 2000; year++) { if ((year % 4 == 0) && (year % 100 != 0) || (year % 100 == 0)) { printf("%d ",year); } } return 0; }
结果:
7、1到 100 的所有整数中出现多少个数字9
代码实现:
#include <stdio.h> int main() { int i = 0; int count = 0; for (i = 1; i <= 100; i++) { if (i % 10 == 9 || i / 10 == 9) { printf("%d ",i); count++; } } printf("\n一共有%d个9:", count); return 0; }
结果:
8、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
代码实现:
#include <stdio.h> int main() { float sum1 = 0.0; float sum2 = 0.0; float sum = 0.0; int i = 0; for (i = 1; i <= 100; i++) { if (i % 2 == 0) { sum1 += 1.0 / i; } else { sum2 = sum2 += 1.0 / i; } } sum = sum2 - sum1; printf("%f ",sum); return 0; }
结果:
9、给定两个数,求这两个数的最大公约数
什么是最大公约数:
最大公约数又叫最大公因数,是指两个或多个整数共有约(因)数中最大的一个。
示例:
输入:50 100
输出:50
代码实现:
解法1:
#include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); int min = (a > b ? b : a); while (1) { if (a % min == 0 && b % min == 0) { printf("%d",min); break; } min--; } return 0; }
解法2:辗转相除法
#include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); int r = 0; while (r = a%b) { a = b; b = r; } printf("%d ",b); return 0; }
结果:
10、给定两个数,求这两个数的最小公倍数
什么是最小公倍数:
在两个或两个以上的自然数中,如果它们有相同的倍数, 这些倍数就是它们的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。
代码实现:
解法1:
#include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d",&a,&b); int max = a > b ? a : b; while (1) { if (max % a == 0 && max % b == 0) { printf("%d", max); break; } max++; } return 0; }
结果:
11、求10 个整数中最大值
代码实现:
#incldue <stdio.h> int main() { int arr[10] = { 1,22,34,11,33,4,5,6,30,12 }; int max = arr[0]; int i = 0; for (i = 0; i < 10; i++) { printf("%d ",arr[i]); if (max < arr[i]) { max = arr[i]; } } printf("\n数据中最大的是:%d",max); return 0; }
结果:
希望大家监督,发现错误的小伙伴记得私信我哦,我会及时改正,嘻嘻嘻。