本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。
今日练习题关键字:最大连续1的个数 完全数计算
💓博主csdn个人主页:小小unicorn
⏩专栏分类:C语言天天练
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识
Day1
- 题目一:
- 题目描述:
- 解题思路:
- 代码实现
- 结果情况:
- 题目二:
- 题目描述:
- 解题思路:
- 代码实现:
- 结果情况:
- 总结:
题目一:
题目描述:
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
解题思路:
为了得到数组中最大连续 1 的个数,需要遍历数组,并记录最大的连续 1 的个数和当前的连续 1 的个数。如果当前元素是 1,则将当前的连续 1 的个数加 1,否则,使用之前的连续 1 的个数更新最大的连续 1的个数,并将当前的连续 1 的个数清零。
遍历数组结束之后,需要再次使用当前的连续 1 的个数更新最大的连续 1 的个数,因为数组的最后一个元素可能是 1,且最长连续 1 的子数组可能出现在数组的末尾,如果遍历数组结束之后不更新最大的连续 1 的个数,则会导致结果错误。
代码实现
int findMaxConsecutiveOnes(int* nums, int numsSize)
{int maxCount = 0, count = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] == 1) {count++;} else {maxCount = fmax(maxCount, count);count = 0;}}maxCount = fmax(maxCount, count);return maxCount;
}
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
解题思路:
我们只需要从1开始把所有可以整除n的约数全部加起来即可
- 约数就是能够被数字整除,而这里简化的一个思路是数字能够被整除,则除数和结果就都是约数,这种思路下,只需
要从1计算到平方根即可,为何是平方根看下面即可
比如:数字 8 , 能够整除 2 ,结果是 4 ,则除数 2 和结果 4 都是约数,而这两个只需要一次计算判断即可。
需要注意的是 4,9,25… 这种,除数和结果相同的情况,则除数或者结果只相加一次就够了
代码实现:
#include<stdio.h>
#include<math.h>
int find(int n)
{int sum = 1; //因为i从2开始把1跳过了,所以sum等于1加回来int i = 0;//这里为何可以开平方根呢? sqrt(n)//因为n被1到n-1之间任一整数整除时,两个因子有一个必定小于或等于 根号n// 另一个大于或等于根号n//例如16能被2,4,8整除,16=2*8,2小于4,8大于4,因此只需要判定1到根号n有无因子即可for (i = 2; i <= sqrt(n);i++) { //这里i没有等于1是因为题目说除了自身以外的约数if (n % i == 0) {//是否为约数sum += i;int m = n / i;if (i != sqrt(n)) {//例如9=3x3,这是防止重复的数加进来sum += m;}}}if (sum == n) {return 1;} else {return 0;}
}
int main()
{int n = 0;while (scanf("%d", &n) != EOF) {int i = 0;int count = 0; //计数for (i = 2; i <= n;i++) { //对n以内的数字都进行判断是否是完全数,注意1不参与判断//原因是上面sum初始化成1了,如果i等于1的话85行代码sum==nint pan = find(i); //会多返回一次if (pan) {count++;}}printf("%d\n", count);}return 0;
}
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!